如何在循环中链接Angular.JS的承诺

How to chain Angular.JS promises in a loop

本文关键字:Angular JS 承诺 链接 循环      更新时间:2023-09-26

我需要在javascript中设计一个函数,使请求POST多个项目到数据库。然后,我必须获取已返回的所有数据,并对数据库运行另一个$http查询。

这是我的代码

var current_request=null;
var workorders=[];
$scope.submit_work_order=function(){
    for(var i=0;i<$scope.parent_jobs.length;i++){
         addPartAndWorkOrder(equipment_id,part_number,work_order,_id);  
    }
    if(current_request!=null){
        current_request.then(function(){
                    if(workorders.length>0){
                        $http({
                            url:'/api/salesorders', 
                            method: "POST",
                            data: {'workorders':workorders}
                        })
                    }
        });
}
function addPartAndWorkOrder(equipment_id,part_serial_number,work_order_id, job_id){
    //part_serial_number
        var info;
        info=$http({url:'/api/parts', 
                    method: "POST",
                    data: {'equipment':equipment_id});
        if(current_request==null){
            current_request=info;
        }
        else{
            current_request.then(function(){
                return info
                });
            });
        }
        current_request.then(function(data){
            return $http({
                url:'/api/workorders', 
                method: "POST",
                data: {workorder_id:work_order_id, part:data._id,job:job_id}
            }).then(function(data){
                workorders.push(data._id);
            });
        })
}

我需要的是通过运行代码中的HTTP请求来填充数组workorders

然后我需要用数组

中的数据运行对端点api/salesorders/的最后一个请求

TL;博士

这是端点应该运行的方式

parts->workorders->parts->workorders->salesorder

这是他们运行的方式

parts->salesorder->workorders->parts->workorders

我试图继续添加到.then,但由于它目前仍然失败

将调用分解为依赖树。看来你们的呼叫模式应该是这样的:

<>之前零件(1)->工单(data1) -> _id1\部分(2)——> workorders (data2)——> _id2——> salesorder ([_id1、id2 _id3])/零件(3)->工单(data3) -> _id3之前

因此,单独地,parts-->workorder必须顺序完成,但所有它们都可以并行地完成。

这是如何做到的(为了简洁,我省略了特定的API调用和参数):

function submitWorkOrder(){
  var parent_jobs = [{}, {}, ]; // this is your array of jobs (however you get it)
  var partsAndOrdersPromises = [];
  parent_jobs.forEach(
    function(job){
       var promise = postPart(job).then(postWorkOrder);
       partsAndOrdersPromises.push(promise);
    });
  var allPartsAndWorkordersPromise = $q.all(partsAndOrdersPromises);
  return allPartsAndWorkordersPromise.then(postSalesOrder);
}

postSalesOrder看起来像这样:

function postSalesOrder(workorders){
   // workorders is an array of results of each workorder call
   return $http.post("/api/salesorder", ...);
}

OFF-TOPIC:如果你可以控制你的服务器API,你应该考虑创建一个单独的API,并在最后作为一个事务发布所有的信息来创建零件、工作订单和销售订单。对每个订单都有一个API调用并不是一个好主意,当然,它不能保持事务的完整性(例如,/api/salesorder可能失败,但您已经提交了以前的订单)