Javascript 循环超出范围,不执行承诺链
我想将最终的json返回到我的UI。但是,循环的控制在我的承诺执行之前返回。在asyc函数或调用异步过程的函数中,您必须使用返回承诺或使用回调来捕获错误和数据Javascript 循环超出范围,不执行承诺链,javascript,backbone.js,promise,Javascript,Backbone.js,Promise,我想将最终的json返回到我的UI。但是,循环的控制在我的承诺执行之前返回。在asyc函数或调用异步过程的函数中,您必须使用返回承诺或使用回调来捕获错误和数据 searchOrder.callApiBasedOnSearchBy = function(searchBy,responseObj) { var recordsFinalObj = { recordsArray: [], isOrderList: false }; var finalJ
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;
}
}
承诺是一个返回值(对未来结果的承诺),而不是一个函数,并且不会“执行”。因此,你应该归还它们
mapSearchByToApi。订单号
立即返回undefined
。还有,循环在哪里?如果你写一个简单的函数,做一些异步的事情,然后尝试从中返回一些东西,看看会发生什么,然后首先处理这种情况,那会更好,而不是写一堆不起作用的代码,然后在stackoverflow上发布它,说它不起作用……我一定错过了什么,但是,代码中的循环在哪里呢?如果您正在执行异步操作,则始终需要返回函数的承诺(特别是然后
回调函数)。
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);
}) ;
});
}
};