循环超出范围,不执行承诺链
Loop going out of scope not executing chain of promises
searchOrder.callApiBasedOnSearchBy = function(searchBy,responseObj) {
var recordsFinalObj = {
recordsArray: [],
isOrderList: false
};
var finalJson = {};
var self = this;
var mapSearchByToApi = {
'INVOICE_NUMBER': function(responseObj) {
},
'ORDER_NUMBER': function(responseObj) {
self.orderDetailsModel.set("id",responseObj.id);
self.orderDetailsModel.fetch({}).then(function(orderDetailsResponse) {
var orderDetails = orderDetailsResponse.records[0];
if(typeof orderDetails.packet_ids !== 'undefined') {
var packet_id = orderDetails.packet_ids[0];
self.packetDetailsModel.set("id",packet_id);
self.packetDetailsModel.fetch({}).then(function(packetDetailsResponse) {
console.log(packetDetailsResponse);
finalJson = packetDetailsResponse.records[0];
finalJson.order_items = orderDetails.order_items;
console.log(finalJson);
return finalJson;
}, function(error) {
console.log("Error in Order Item:"+error);
});
}
}, function(error) {
console.log("Error in Order:"+error);
})
},
'AWB_NUMBER': function(responseObj) {
},
'CHANNEL_ORDER_ID': function(responseObj) {
}
}
if(mapSearchByToApi[searchBy]) {
finalJson = mapSearchByToApi[searchBy](responseObj);
recordsFinalObj.recordsObj = finalJson;
return recordsFinalObj;
}
}
我想将最终的 json 返回到我的 UI。但是,在我的承诺执行之前,循环的控制是返回的。
在 asyc 函数或调用异步过程的函数中,您必须使用返回承诺或使用回调来捕获错误和数据。
searchOrder.callApiBasedOnSearchBy = function(searchBy,responseObj) {
var recordsFinalObj = {
recordsArray: [],
isOrderList: false
};
var finalJson = {};
var self = this;
var mapSearchByToApi = {
'INVOICE_NUMBER': function(responseObj) {
},
'ORDER_NUMBER': function(responseObj) {
// Return a promise instead of trying to return data itself
return new Promise(function(resolve, reject) { self.orderDetailsModel.set("id",responseObj.id);
self.orderDetailsModel.fetch({}).then(function(orderDetailsResponse) {
var orderDetails = orderDetailsResponse.records[0];
if(typeof orderDetails.packet_ids !== 'undefined') {
var packet_id = orderDetails.packet_ids[0];
self.packetDetailsModel.set("id",packet_id);
self.packetDetailsModel.fetch({}).then(function(packetDetailsResponse) {
console.log(packetDetailsResponse);
finalJson = packetDetailsResponse.records[0];
finalJson.order_items = orderDetails.order_items;
console.log(finalJson);
return resolve(finalJson); // resolve ur data
}, function(error) {
console.log("Error in Order Item:"+error);
reject(error);
});
}
}, function(error) {
console.log("Error in Order:"+error);
});
});
},
'AWB_NUMBER': function(responseObj) {
},
'CHANNEL_ORDER_ID': function(responseObj) {
}
};
if(mapSearchByToApi[searchBy]) {
// Have to return a promise
return new Promise(function(resolve, reject) {
mapSearchByToApi[searchBy](responseObj)
.then(function(finalJson) {
recordsFinalObj.recordsObj = finalJson;
resolve(recordsFinalObj);
})
.catch(function(err){
reject(err);
}) ;
});
}
};
相关文章:
- Bluebird中承诺链数组的串行执行
- 执行一系列 Javascript 承诺一个接一个地解决
- 控制承诺执行顺序
- 如何按顺序执行承诺数组
- 无法执行链式承诺
- 循环超出范围,不执行承诺链
- 如何将 $http.put 封装到一个函数中,该函数执行某些操作,然后返回通过或失败的承诺
- 在猫鼬中创建承诺时,不会调用执行器
- 嵌套承诺执行不同步
- nodeJS中的承诺/承诺中的回调/执行顺序是不对的
- 两个捕获的承诺/块声明都没有执行
- 从数组中按顺序执行一堆 WinJS 承诺
- Javascript Jquery在外部样式表更改/重新加载承诺方式后执行代码
- $.延迟:如何检测每个承诺何时执行
- 无论承诺是否履行,如何执行相同的操作
- 链式jQuery承诺提前执行
- 承诺链不使用 Q 承诺库按顺序执行
- 在angularJS中返回一个自执行承诺的值
- AngularJS依次执行承诺
- 为什么我的node-oracledb执行承诺在解决所需的时间上稳步增加