skj*_*l93 3 javascript node.js promise q
我有以下代码:
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!!");
});
Run Code Online (Sandbox Code Playgroud)
Q.all如何知道promises数组具有forEach循环所需的所有承诺?有时候,我的Q.all会在forEach之前运行.请告诉我哪里出错了.
doSomething()是一个返回promise的异步函数.
Q.all在你之前无法运行forEach,因为forEach是同步的.
但实际上,在调用Q.all 之后,你实际上会在数组中输入内容.你使用promises的方式有点尴尬:不需要在promise中使用deffered!
另外,在拒绝或解决之后,您不希望推动自我保护,而是保留它所承诺的承诺.有关如何"promisify"异步功能的更多信息,请参见下文.
Deffered用于定义基于symple回调的异步代码中的promise.因为doSomething()返回一个承诺(你正在使用.then()),你实际上可以这样做:
var a = [1,2,3,4,5];
var promises = [];
a.forEach(function(item,index){
var promise = doSomething().then(function(data){
return Q(true);
});
promises.push(promise);
});
Q.all(promises).then(function(data){
console.log("something!!");
});
Run Code Online (Sandbox Code Playgroud)
然后承诺将直接填充承诺,没有任何延迟.
编辑:既然你问的是doSomething没有启用承诺,你可以做以下事情:
假设doSomething在一些异步任务之后将一个回调作为参数.
然后你可以这样包装doSomething:
function doSomethingPromise(){
var defered = Q.defer();
doSomething(function(err,data){
if(err){
defered.reject(err);
}
else{
defered.resolve(data);
}
});
return defered.promise;
}
Run Code Online (Sandbox Code Playgroud)
然后使用doSomethingPromise()如上所述,而不是doSomething,因为这一个返回一个承诺.
| 归档时间: |
|
| 查看次数: |
8143 次 |
| 最近记录: |