您不能在事后向数组添加承诺并期望它会影响之前的.all()。 .all() 不是这样工作的。你可以这样做:
var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
$q.all([allDone, promise4]).then(function() {
// all four promises are done here
});
或者,您可以放弃 allDone 承诺并重新创建一个新的 .all(),如下所示:
var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
promises.push(promise4);
var all4Done = $q.all(promises);
根据您的 cmets,这是另一种可能性。假设您要调用的最终完成处理程序位于名为allDoneNow() 的函数中。然后,您可以执行以下操作:
var promises = [promise1, promise2, promise3];
var allDone = $q.all(promises);
allDone.then(function(results) {
// if no new promises have been added to the array
if (promises.length === results.length) {
// call our final handler
return allDoneNow(results);
} else {
// wait for any new promises
return $q.all(promises).then(allDoneNow);
}
});
promises.push(promise4);
或者,如果您希望它递归以便它不断检查更多,您可以将它放在一个可以递归使用的函数中:
function waitAll(promiseArray) {
return $q.all(promiseArray).then(function(results) {
if (promiseArray.length <= results.length) {
// everything currently in the promiseArray is now done
return results;
} else {
// there are some new things in the promiseArray so
// wait until they are done
return waitAll(promiseArray);
}
});
}
var promises = [promise1, promise2, promise3];
waitAll(promises).then(function(results) {
// all promises currently in the promises array are done
});
promises.push(promise4);