[英]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/
進行最后一次運行的最終請求
這是端點應運行的方式
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.