angularjs – angular $q,如何链接在for循环内和之后的多个promises

我想有一个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/

此时它看起来像执行顺序很好(见控制台输出)。

我的猜测是,这是因为每个函数调用立即返回,而不做任何真正的工作。我试图延迟defer.resolve与setTimeout但失败(即最后的代码块从未执行)。你可以在小提琴的outcommented块中看到它。

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

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

你需要使用的是 $q.all,它将许多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 是一个JavaScript 框架。它可通过 注:建议把脚本放在 元素的底部。这会提高网页加载速度,因...
angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题。出现这个的原因是:由于...
AngularJS 通过被称为指令的新属性来扩展 HTML。AngularJS 指令AngularJS 指令是扩展的 HTML 属性,带有...
AngularJS 使用表达式把数据绑定到 HTML。AngularJS 表达式AngularJS 表达式写在双大括号内:{{ expres...
ng-repeat 指令可以完美的显示表格。在表格中显示数据 {{ x.Name }} {{ x.Country }} 使用 CSS 样式为了...
$http是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。读取 JSON 文件下是存储在web服务器上...