我有以下代码:
var a = [1,2,3,4,5];
var promises = [];
a.forEach(function(item,index){
var deferred = Q.defer();
doSomething().then(function(){
deferred.resolve(true);
promises.push(deferred);
});
});
Q.all(promises).then(function(data){
console.log("something!!");
});
Q.all如何知道promises数组具有forEach循环所需的所有承诺?有时候,我的Q.all会在forEach之前运行 . 请告诉我哪里出错了 .
doSomething()是一个返回promise的异步函数 .
2 回答
Q.all
无法在forEach
之前运行,因为forEach
是同步的 .但实际上,在调用Q.all之后,你实际上会在数组中输入内容 . 你使用promises的方式有点尴尬:不需要在promise中使用deffered!
另外,在拒绝或解决之后,您不希望推动自我保护,而是保留它所承诺的承诺 . 有关如何“promisify”异步功能的更多信息,请参见下文 .
Deffered用于定义基于symple回调的异步代码中的promise . 由于
doSomething()
返回一个承诺(你使用.then()
),你实际上可以这样做:然后承诺将直接填充承诺,没有任何延迟 .
编辑:因为你问
doSomething
没有启用承诺,这是你可以做的:假设
doSomething
将一个异步任务后执行的回调作为参数 .然后你可以这样包装
doSomething
:然后使用上面提到的
doSomethingPromise()
而不是doSomething
,因为这个返回一个promise .问题是当执行
Q.all
时,promises
数组仍为空 . 延迟对象被异步推送到promises
,因此Q.all()
将在解决doSomething()
的承诺之前执行 .