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 当你可以马上得到承诺时,而是承诺 Fn1
、Fn2
和 Fn3
并简单地使用Q.all(values.map(value => Fn1P(value).then(Fn2P).then(Fn3P)))
.)
实现了承诺队列(通过 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 当你可以马上得到承诺时,而是承诺 Fn1
、Fn2
和 Fn3
并简单地使用Q.all(values.map(value => Fn1P(value).then(Fn2P).then(Fn3P)))
.)