Node JS嵌套Q.所有等待解决方案


//pseudo code
function f2(){
    var deferred = Q.defer();
    Q.all(chunked.map(f12)).then(function(results){
        Q.all(results.map(f13)).then(function(){
            //f13 returns promise that return value
            deferred.resolve();
        });
    });
    return deferred.promise;
}
f2().then(function(){
    console.log("end");
});

所以我已经脱离了功能,并且知道"抗模式",但是我的特定功能需要脱离。而且我有两个嵌套的Q.ALL功能。一切都很好,但是F2()。?

正如其他人所说的,(在阅读了一些有关Q.defer()之后),我看到您正在多次解决deferred变量。

如果我了解您要做的正确的事情,则应该在(实际上"在")外部Q.all()后解决。

//pseudo code
function f2(){
    var deferred = Q.defer();
    Q.all(chunked.map(f12)).then(function(results){
        // Notice prepended 'return' to not break the chain.
        return Q.all(results.map(f13)).then(function(){
            //f13 returns promise that return value
            //deferred.resolve(); // Wrong.
            return f13;
        });
    }).then(function(arr){
        deferred.resolve(arr); // <-- This resolves ONCE.
        // Of course you don't need to return arr if you doesn't
        // care about it. But I think is always better to do things right.
        return arr; // Also unnecessary unless you could want to chain
                    // another .then() to the outer promise.
    });
    return deferred.promise;
}
f2().then(function(){
    console.log("end");
});

希望它有帮助(当然,未经测试:它可能包含错误,但我认为它解释了概念)。

edit:我错过了说(甚至您知道您知道这是一个对抗者),至少在您的示例中没有理由使用Q.defer(),因为您可以直接返回外部Q.all()Promise ...

也许您发布的只是简化的更复杂代码的版本...

但下面应揭示等效的行为,并且更简单:

//pseudo code
function f2(){
    return Q.all(chunked.map(f12)).then(function(results){
        // Notice prepended 'return' to not break the chain.
        return Q.all(results.map(f13)).then(function(){
            return f13;
        });
    })
}
f2().then(function(){
    console.log("end");
});

相关内容

最新更新