我有这段代码:
var promiseArr = [],
innerPromises = [],
innerIndex = 0;
angular.forEach(some_object, function (value, key) {
console.log(1);
innerPromises[innerIndex] = $q.defer();
promiseArr.push(innerPromises[innerIndex].promise);
(function(innerIndex) {
func_returning_promise(args).then(function(data) {
console.log(2);
// Some code working on returned data
innerPromises[innerIndex].resolve(true);
});
})(innerIndex);
innerIndex++;
});
$q.all(promiseArr).then(function() {
console.log(3);
});
forEach
运行3次。预期结果将是
1
1
1
2
2
2
3
但是3
在2
之前和1
之后出现,这对我来说似乎完全不合逻辑! innerPromises
在2
已被记录后无法解决。
感谢您提供任何帮助。
答案 0 :(得分:2)
你的代码似乎不完整,无论如何经过一些调整我能够使你的代码在jsfiddle上工作。 https://jsfiddle.net/yw6qztxm/
angular.module('indexApp', []).controller('indexController', function($q, $timeout) {
var promiseArr = [],
innerPromises = [],
innerIndex = 0;
var some_object = { 1:1, 2:2, 3:3 }
var args = false;
function func_returning_promise() {
return $q(function(resolve) {
$timeout(resolve, 100 + 100 * innerIndex);
});
}
angular.forEach(some_object, function (value, key) {
console.log(1);
innerPromises[innerIndex] = $q.defer();
promiseArr.push(innerPromises[innerIndex].promise);
(function(innerIndex) {
func_returning_promise(args).then(function(data) {
console.log(2);
// Some code working on returned data
innerPromises[innerIndex].resolve(true);
});
})(innerIndex);
innerIndex++;
});
$q.all(promiseArr).then(function() {
console.log(3);
});
});
它做了预期的事情,因为3是最后记录的,也许你应该用缺少的函数和变量做一个有效的例子。
答案 1 :(得分:1)
我的猜测是,在提取代码而不是发布完整示例时,您已经改变了行为。最有可能在原始版本中forEach()
也在异步回调中,这意味着$q.all()
正在空列表中运行并立即解析。
所以我建议的顺序是:
$q.all()
在空列表上运行,因此承诺B返回
解析。forEach
循环并打印所有1
并将promises附加到其中
阵列。3
。2
。