Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Angular$q.all()不等待所有承诺_Angularjs_Promise_Angular Promise - Fatal编程技术网

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