Angular $ q.all()不等待所有的承诺

时间:2016-11-03 12:55:08

标签: 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);
    (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

但是32之前和1之后出现,这对我来说似乎完全不合逻辑! innerPromises2已被记录后无法解决。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

你的代码似乎不完整,无论如何经过一些调整我能够使你的代码在jsfiddle上工作。     https://jsfiddle.net/yw6qztxm/

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);
});

});

它做了预期的事情,因为3是最后记录的,也许你应该用缺少的函数和变量做一个有效的例子。

答案 1 :(得分:1)

我的猜测是,在提取代码而不是发布完整示例时,您已经改变了行为。最有可能在原始版本中forEach()也在异步回调中,这意味着$q.all()正在空列表中运行并立即解析。

所以我建议的顺序是:

  1. 你做的事情没有立即解决了承诺A。
  2. $q.all()在空列表上运行,因此承诺B返回    解析。
  3. Angular运行promise A的成功函数    forEach循环并打印所有1并将promises附加到其中    阵列。
  4. 然后它运行promise B的成功函数,打印出来    3
  5. 然后其他承诺完成并打印2