Nodejs并行异步调用,但优先
问题描述:
假设我使用Node.js尝试运行两个异步调用以获得一些答案。我知道有一个异步包,你可以传递两个函数和一个可选的回调函数。Nodejs并行异步调用,但优先
async.parallel([fun1(){callback(null,1);},
fun2(){callback(null,2);}],
function(err, results) {
});
但是假设我现在有一个优先权,如果FUN1返回一个值,然后我不需要FUN2的答案,只有FUN1返回null,则我等FUN2。所以我不想使用回调函数,因为回调函数等待两个函数完成,并且fun2可能需要很长时间。
现在,我只是通过为两个异步调用创建回调函数来使用非常详尽的方式。
function(){
var theAnswer,FromFun1,FromFun2;
var reply1,reply2;
fun1(reply1="answered";FromFun1=1;complete());
fun2(reply2="answered";FromFun2=2;complete());
function complete(answer){
if(reply1=="answered"){
theAnswer=FromFun1;
}else if(reply1==null){
// Don't do anything because fun1 is not finished running.
}else if(reply2=="answered"){
theAnswer=FromFun2;
}else{
// Both have no answer, err.
}
}
}
有没有更好的方法来做到这一点?
答
我已经使用该方案的关键是要回到“完成”回调的第一个参数:
async.parallel([
function(callback){
callback("done",1);
},
function(callback){
callback(null,2);
}
], function(err, results) {
console.log(err, results); // done [ 1 ] or done [ 1 , 2 ]
});
听起来像一个黑客,我通常不这样做,但在像这样的一些罕见的情况下,它实际上保持代码干净...只是将它记录下来,以便其他人知道你的意图是什么。
+0
使用异常控制流,特别是对于快捷异步函数,是一个聪明的黑客:-) – Bergi
答
它更好地使用瀑布而不是平行执行因为你可以将结果形式传递给你的前一个函数作为参数。
async.waterfall([
function(callback){
callback(null, 'one');
},
function(arg1, callback){
// arg1 now equals 'one'
if(arg1==null){
// it will not take time it returns immediately
callback(null, 'done');
}else{
// do your another stuff here fun2 logic here
// it will not be executed and so it dont take time
}
}
], function (err, result) {
// result now equals 'done'
});
您应该尝试承诺。这将如'var second = fun2();返回fun1()。then(function(r){return r || second;})' – Bergi
谢谢Bergi,这很有帮助。我会投你:) – Evilsanta
谢谢@Bergi,这是有帮助的。我会投你:)。我还有一个问题。在then()中,它返回r,这是答案,或者是'second',这是一个承诺。我下一步如何处理? – Evilsanta