Angularjs Angular$q.all()不等待所有承诺
我有以下代码:Angularjs Angular$q.all()不等待所有承诺,angularjs,promise,angular-promise,Angularjs,Promise,Angular Promise,我有以下代码: var promiseArr = [], innerPromises = [], innerIndex = 0; angular.forEach(some_object, function (value, key) { console.log(1); innerPromises[innerIndex] = $q.defer(); promiseArr.push(innerPromises[innerIndex].promise);
var promiseArr = [],
innerPromises = [],
innerIndex = 0;
angular.forEach(some_object, function (value, key) {
console.log(1);
innerPromises[innerIndex] = $q.defer();
promiseArr.push(innerPromises[innerIndex].promise);
(function(innerIndex) {
func_returning_promise(args).then(function(data) {
console.log(2);
// Some code working on returned data
innerPromises[innerIndex].resolve(true);
});
})(innerIndex);
innerIndex++;
});
$q.all(promiseArr).then(function() {
console.log(3);
});
forEach
运行3次。预期结果将是:
1
1
1
2
2
2
3
但是3
在2
s之前和1
s之后出现,这在我看来完全不合逻辑!InnerPromissions
未解析,但在记录了2
s之后
感谢您的帮助。您的代码似乎不完整,经过一些修改后,我能够使您的代码在JSFIDLE上工作。
它做到了预期的效果,因为3是最后一个记录的,也许您应该用缺少的函数和变量制作一个工作示例。您的代码似乎不完整,无论如何经过一些修改后,我能够使您的代码在JSFIDLE上工作。
它做到了预期的效果,因为3是最后记录的,也许你应该用缺失的函数和变量制作一个工作示例。我的猜测是,在提取代码位而不是发布一个完整的示例时,你改变了行为。在您的原始版本中,
forEach()
所以我建议的顺序是:
你做了一些没有表现出来的事情,这会立即解决承诺a
$q.all()
在空列表上运行,因此它返回的承诺B
解决
Angular为promise A运行成功函数,promise A运行
forEach
循环并打印所有1
,并将承诺附加到
阵列
然后,它运行promise B的成功函数,该函数打印
3
然后,另一个完成并打印2
我的猜测是,在提取代码位而不是发布完整的示例时,您已经改变了行为。在您的原始版本中,forEach()
所以我建议的顺序是:
你做了一些没有表现出来的事情,这会立即解决承诺a
$q.all()
在空列表上运行,因此它返回的承诺B
解决
Angular为promise A运行成功函数,promise A运行
forEach
循环并打印所有1
,并将承诺附加到
阵列
然后,它运行promise B的成功函数,该函数打印
3
然后,另一个完成并打印2
这不是我回答的一部分,所以我要加上一句作为评论:你不必明确地创建内在承诺func\u returning\u promise(args)。然后(…)
返回一个promise,因此您可以将其推送到promise数组中,当成功函数完成时,它将自动为您解决或拒绝。这不是我的答案的一部分,因此我将作为注释添加:您不必显式创建内部承诺func\u returning\u promise(args)。然后(…)
返回一个promise,因此您可以将其推送到promise数组中,当success函数完成时,它将自动为您解决或拒绝。
angular.module('indexApp', []).controller('indexController', function($q, $timeout) {
var promiseArr = [],
innerPromises = [],
innerIndex = 0;
var some_object = { 1:1, 2:2, 3:3 }
var args = false;
function func_returning_promise() {
return $q(function(resolve) {
$timeout(resolve, 100 + 100 * innerIndex);
});
}
angular.forEach(some_object, function (value, key) {
console.log(1);
innerPromises[innerIndex] = $q.defer();
promiseArr.push(innerPromises[innerIndex].promise);
(function(innerIndex) {
func_returning_promise(args).then(function(data) {
console.log(2);
// Some code working on returned data
innerPromises[innerIndex].resolve(true);
});
})(innerIndex);
innerIndex++;
});
$q.all(promiseArr).then(function() {
console.log(3);
});
});