簡體   English   中英

如何在循環中鏈接Angular.JS Promise

[英]How to chain Angular.JS promises in a loop

我需要在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; DR

這是端點應運行的方式

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

這就是他們的跑步方式

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

我試圖繼續添加.then但是目前它仍然失敗

將您的調用分解為依賴樹。 看來您的呼叫方式必須像這樣:

parts(1) --> workorders(data1) --> _id1
                                        \
parts(2) --> workorders(data2) --> _id2--> salesorder([_id1, id2, _id3])
                                        /
parts(3) --> workorders(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", ...);
}

主題外:如果您可以控制服務器API,則應考慮創建一個API,並在交易結束時發布所有信息以創建零件,工作訂單和銷售訂單。 每個調用都有一個API並不是一個好主意,當然,它不能保持事務的完整性(例如/api/salesorder可能會失敗,但是您已經提交了先前的訂單)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM