最佳答案
我希望有一个 for 循环,它在每次迭代中调用异步函数。
在 for 循环之后,我想执行另一个代码块,但不是在 for 循环中的所有以前的调用都得到解决之前。
我目前的问题是,for 循环之后的代码块要么在所有异步调用完成之前执行,要么根本不执行。
带 FOR 循环的代码部分和后面的代码块(完整的代码请参阅 小提琴) :
[..]
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.decision,但是失败了(也就是说,最后一个代码块从未执行过)。您可以在小提琴的注释块中看到它。
当我使用真正的函数写入文件和读取文件时,最后一个代码块是在最后一个写操作完成之前执行的,这不是我想要的。
当然,错误可能出现在其中一个读/写函数中,但是我想确认我在这里发布的代码没有任何错误。