Nodejs并行异步调用,但具有优先级



假设我使用Node.js尝试运行两个异步调用以获得一些答案。我知道有一个async包,你可以传递两个函数,和一个可选的回调。

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.
       }
   }
}

有更好的方法吗?

我在这个场景中使用的技巧是在回调的第一个参数中返回"done":

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 ] 
});

听起来像一个hack,我通常不这样做,但在一些罕见的情况下,像这个,它实际上保持代码干净…把它记录下来,这样别人就知道你的意图了。

最好使用瀑布而不是并行执行,因为你可以将前一个函数的结果作为参数传递给下一个函数。

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'    
}); 

最新更新