【发布时间】:2014-09-12 08:53:21
【问题描述】:
假设我使用 Node.js 尝试运行两个异步调用以获得一些答案。我知道有一个异步包,你可以在其中传递两个函数和一个可选的回调。
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.
}
}
}
有没有更好的方法来做到这一点?
【问题讨论】:
-
您应该尝试使用 Promise。就像
var second = fun2(); return fun1().then(function(r) { return r || second; })一样简单 -
感谢 Bergi,这很有帮助。我会投票给你:)
-
谢谢@Bergi,这很有帮助。我会投票给你:)。我还有一个问题。在 then() 中,它要么返回 r,即答案,要么返回 'second',即承诺。接下来我该如何处理?
-
如果你返回答案,它将使用它,如果你从
then返回一个承诺,它会等待那个。这就是then的意义所在:-)
标签: javascript node.js asynchronous parallels