节点 js 嵌套 Q.all 等待解决

node js nested Q.all await resolve

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

所以我有延迟功能并且我知道 "anti-pattern" 但我有需要延迟的特定功能。我有两个嵌套的 q.all 函数。一切正常但 f2().then(... 不等待 deferred.resolve() 并立即在控制台中抛出 "end" 然后执行所有 "queued" 承诺。所以我可以做等待解决吗?

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

如果我理解你正在努力做的事情,你应该在(实际上 "on")外部 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");
});

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

编辑:我没说(即使你告诉过你知道这是一个反模式),至少在你的例子中没有理由使用 Q.defer() 因为你可以直接 return outer Q.all() promise...

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

但下面应该公开等效的行为并且更简单:

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