我正在尝试链接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);
});
};
答案 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);