Async.waterfall 在 promise 队列中无法显示缩进行为

Async.waterfall inside a promise queue fails to show the indented behaviour

实现了承诺队列(通过 q 库)。

PQFn1-(然后)- PQFn2-(然后)-....

PQFn1 将值数组传递给回调函数(使用 Q.defer 实现),returns 结果。 所以流程从 PQFn1 切换到 ProcessResultFn([values]) 内部 ProcessResultFn-

ProcessResultFn(values){
    var deferred = Q.defer();

async.map(values,FetchResult,function(err,res){
      if (err) {
      deferred.reject(err);
      return deferred.promise;
    } else {
      deferred.resolve(res);
      return deferred.promise;
    }
})
}

Function FetchResult(value,done){
async.waterfall(Fn1,Fn2,Fn3,done);
}
}

在呼叫到达 Fn1 之前,流程工作正常。但是,一旦 Fn1 调用 cb()- 将调用传递给 Fn2。流程切换到承诺队列的 PQFn2,甚至不等待 ProcessResultFn 的结果。 对 Fn2 然后对 Fn3 的调用也在稍后执行,当事件循环拾取它时(我记录了它)。然而,从 PQFn1 到 PQFn2 的初始结果始终未定义。 谁能解释一下为什么会这样。

您必须 return 来自 ProcessResultFn 函数的承诺,而不是来自 async.map 回调的承诺:

ProcessResultFn(values) {
    var deferred = Q.defer();
    async.map(values,FetchResult,function(err,res){
        if (err) {
            deferred.reject(err);
        } else {
            deferred.resolve(res);
        }
    });
    return deferred.promise;
//  ^^^^^^^^^^^^^^^^^^^^^^^
}

(当然我建议不要使用 async.js 当你可以马上得到承诺时,而是承诺 Fn1Fn2Fn3 并简单地使用Q.all(values.map(value => Fn1P(value).then(Fn2P).then(Fn3P))).)