gpt4 book ai didi

javascript - 如何等待所有 promise 完成然后执行操作?

转载 作者:行者123 更新时间:2023-11-30 11:59:59 24 4
gpt4 key购买 nike

我有一系列 promise ,我使用 $q.all 来执行所有 promise ,然后我执行一个操作,以某种方式在 promise 给出答复之前执行此操作。

注意:flightAPIService.getNearestAirports() 返回 $http Angular :

  this.getNearestAirports = function (dataObj) {
console.log('Client::flight service:: get the nearest '+ dataObj.maxAirports+' airport for lat: '+dataObj.lat+'lng:'+dataObj.lng);

return $http.post('/getNearestAirports', dataObj);

//// the result return in JSON format (Server converted the response from XML to JSON)
//answer looks like:
//{"airportResponse":{"$":{"authorisedAPI":"true","processingDurationMillis":"119","success":"true"},"airports":[{"airports":[{"$":{"city":"Tel-aviv","country":"Israel","lat":"32.011389","lng":"34.886667","name":"Ben Gurion","timezone":"Asia/Jerusalem"},"code":["TLV"]}]}]}}
};

当 $q.all 执行 promise (airportPromises) 时,我预计在 promise 准备好之后打印表对象,但实际上在 promise 之前打印的表有答案:

  $q.all(airportPromises).finally(function(res){
//return callback(null, table);
console.log(table);
},function(err){
callback(err);
return console.error('one promise error',err);
})

这里是所有的代码:

this.addAirportsToTable = function (table,callback) {
var airportPromises = [];
// var defered = $q.defer();
this.whenFlightNeeded(table).then(function (result) {
var table = result;
for (let dayIndex = 0; dayIndex < table.length; dayIndex++) {
if (table[dayIndex].flight.flight) {
var origin = {
maxAirports: 3,
lat: table[dayIndex]['cityGoogleInf'][0].latitude,
lng: table[dayIndex]['cityGoogleInf'][0].longitude
};
var dist = {
maxAirports: 3,
lat: table[dayIndex + 1]['cityGoogleInf'][0].latitude,
lng: table[dayIndex + 1]['cityGoogleInf'][0].longitude
};

var promise1 = flightAPIService.getNearestAirports(origin).then(function (resultOriginAirport) {
table[dayIndex]['flight'].airport.push(resultOriginAirport.data);
});

var promise2 = flightAPIService.getNearestAirports(dist).then(function (resultDistAirport) {
table[dayIndex + 1]['flight'].airport.push(resultDistAirport.data);
});

airportPromises.concat([promise1,promise2]);
}
}
$q.all(airportPromises).finally(function(res){
//return callback(null, table);
console.log(table);
},function(err){
callback(err);
return console.error('one promise error',err);
})
});
//return defered.promise;
}

知道如何确保完成所有 promise 然后打印表格吗?

在此屏幕截图中,我们可以看到打印了对象表,然后调试器再次返回以完成 promise 任务: enter image description here

最佳答案

我认为问题出在您的 concat 上。

concat 不会修改现有数组,而是返回一个新数组。因此,您的调用 $q.all 传递给它一个空数组因此会立即解析。

来自MDN :

Note: Concatenating array(s)/value(s) will leave the originals untouched. Furthermore, any operation on the new array will have no effect on the original arrays, and vice versa.

简单示例:https://jsfiddle.net/bunc6zg9/


旁注 $q.all 使用其等待的 promise 值数组进行解析。因此,如果您从两个 promise 中返回 .then 中的表值,则可以在 $.all 中构建您的表。这样,您的 promise 链就没有包含其状态的全局变量。

关于javascript - 如何等待所有 promise 完成然后执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36876134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com