angularjs - Angular $q,如何在 for 循环内和之后链接多个 Promise

标签 angularjs promise angular-promise deferred

我想要一个 for 循环,每次迭代都会调用异步函数。

在 for 循环之后,我想执行另一个代码块,但不是在 for 循环中之前的所有调用都已解析之前执行。

我目前的问题是,for 循环之后的代码块要么在所有异步调用完成之前执行,要么根本不执行。

包含 FOR 循环的代码部分及其后面的代码块(完整代码请参见 fiddle ):

[..]
function outerFunction($q, $scope) {
    var defer = $q.defer();    
    readSome($q,$scope).then(function() {
        var promise = writeSome($q, $scope.testArray[0])
        for (var i=1; i < $scope.testArray.length; i++) {
             promise = promise.then(
                 angular.bind(null, writeSome, $q, $scope.testArray[i])
             );                                  
        } 
        // this must not be called before all calls in for-loop have finished
        promise = promise.then(function() {
            return writeSome($q, "finish").then(function() {
                console.log("resolve");
                // resolving here after everything has been done, yey!
                defer.resolve();
            });   
        });        
    });   

    return defer.promise;
}

我创建了一个 jsFiddle,可以在这里找到 http://jsfiddle.net/riemersebastian/B43u6/3/

目前看来执行顺序很好(请参阅控制台输出)。

我的猜测是,这只是因为每个函数调用都会立即返回而不做任何实际工作。我尝试用 setTimeout 延迟 defer.resolve 但失败了(即最后一个代码块从未执行)。您可以在 fiddle 的注释 block 中看到它。

当我使用写入文件和从文件读取的实际函数时,最后一个代码块在最后一个写入操作完成之前执行,这不是我想要的。

当然,错误可能出现在这些读/写函数之一中,但我想验证我在此处发布的代码是否没有任何问题。

最佳答案

您需要使用的是$q.all它将多个 Promise 合并为一个,只有当所有 Promise 都得到解决后,该 Promise 才会得到解决。

根据您的情况,您可以执行以下操作:

function outerFunction() {

    var defer = $q.defer();
    var promises = [];

    function lastTask(){
        writeSome('finish').then( function(){
            defer.resolve();
        });
    }

    angular.forEach( $scope.testArray, function(value){
        promises.push(writeSome(value));
    });

    $q.all(promises).then(lastTask);

    return defer.promise;
}

关于angularjs - Angular $q,如何在 for 循环内和之后链接多个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024411/

相关文章:

javascript - 调试未处理的 Promise 拒绝

angularjs - 如何摧毁未兑现的 promise

jQuery Promises 参数失败回调未定义

javascript - javascript中如何执行同步性

javascript - Angular,停止渲染直到获得异步数据

javascript - AngularJS ng-route如何在解析时发出http请求

angularjs - 如何处理不是数组的 Restangular .getList() 响应

Javascript - Angularjs - 传单。翻译

javascript - 有没有办法直接在 Angularjs 中与 Controller 和范围进行交互?

django - Django 和 AngularJS 中的 url 优先级是什么?