在Angular中用$ q链接承诺

时间:2013-09-15 21:15:34

标签: angularjs

我正在尝试链接promises,以便doQuery(0)执行doQuery(1)等等,直到doQuery(9)。

我的问题是我在回调函数中总是等于10。

doQuery(0)然后执行doQuery(10)。

如何在回调函数中传递i的每个值?

var promise = doQuery(0);
for (var i = 1; i < 10; i++) {
    promise = promise.then(function() {
        doQuery(i);
    });
};

2 个答案:

答案 0 :(得分:5)

由于您使用的是Angular.js,因此您应该在bind function使用它:

var promise = doQuery(0);
for (var i = 1; i < 10; i++) {
    promise = promise.then(angular.bind(null, doQuery, i));
}

不依赖于Angular.js,您可以使用闭包为每个回调函数制作i的副本(而不是让它们在外部作用域中共享i的单个副本) :

var promise = doQuery(0);
for (var i = 1; i < 10; i++) {
    promise = promise.then(function(i){
        return function(){
            doQuery(i);
        };
    }(i));
}

在现代Javascript引擎中,您还可以使用原生Function.prototype.bind

var promise = doQuery(0);
for (var i = 1; i < 10; i++) {
    promise = promise.then(doQuery.bind(null, i));
}

答案 1 :(得分:2)

您需要从then回调中返回每个待链接的承诺,否则它可能会失败。要将正确的i值传递给每个回调,请参阅JavaScript closure inside loops – simple practical example

var promise = doQuery(0);
for (var i=0; i<10; i++) (function(ii) {
    promise = promise.then(function() {
        return doQuery(ii);
    });
})(i);