首页 文章

Q.all如何在NodeJS中工作?

提问于
浏览
3

我有以下代码:

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 回答

  • 6

    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!!");
    });
    

    然后承诺将直接填充承诺,没有任何延迟 .

    编辑:因为你问 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;
    }
    

    然后使用上面提到的 doSomethingPromise() 而不是 doSomething ,因为这个返回一个promise .

  • 2

    问题是当执行 Q.all 时, promises 数组仍为空 . 延迟对象被异步推送到 promises ,因此 Q.all() 将在解决 doSomething() 的承诺之前执行 .

相关问题