什么是async.series的SIMPLE实现?

时间:2012-11-28 08:11:07

标签: node.js asynchronous

我有两个功能:

function one(next){
  Users.find({}, function(err, docs){
    if( err)
      next( err );
    } else {
      next( null );
    }
  });
}

function two(next){
  Something.find({}, function(err, docs){
    if( err)
      next( err );
    } else {
      next( null );
    }
  });
}

我可以使用异步库:

async.series( [one, two], function( err ){
  ...
});

这里,如果one()返回err,则立即调用回调(使用err set)。 什么是async.series的 easy ,BASIC实现? 我查看了库async的代码(这太棒了),但它是一个库,意在做很多事情,而且我遇到它真的很麻烦。

你能告诉我一个简单的async.series实现吗?它会简单地一个接一个地调用这些函数的东西,并且 - 如果其中一个调用带有错误的回调 - 调用最后回调并设置err

...谢谢

Merc的。

1 个答案:

答案 0 :(得分:5)

一种实现方式如下:

 function async_series ( fn_list, final_callback ) {
     // Do we have any more async functions to execute?
     if (fn_list.length) {
         // Get the function we want to execute:
         var fn = fn_list.shift();
         // Build a nested callback to process remaining functions:
         var callback = function () {
             async_series(fn_list,final_callback);
         };
         // Call the function
         fn(callback);
     }
     else {
         // Nothing left to process? Then call the final callback:
         final_callback();
     }
 }

上述代码不处理结果或错误的处理。要处理错误,我们只需检查回调中的错误情况,并在出现错误时立即调用最终回调:

 function async_series ( fn_list, final_callback ) {
     if (fn_list.length) {
         var fn = fn_list.shift();
         var callback = function (err) {
             if (err) {
                 final_callback(err); // error, abort
             }
             else {
                 async_series(fn_list,final_callback);
             }
         };
         fn(callback);
     }
     else {
         final_callback(null); // no errors
     }
 }

处理结果可以类似地通过在闭包中跟踪结果数组或将其传递给下一次对async_series的调用来完成。

请注意,最终的最终回调可以假设没有错误,因为它通过if(err)(else)async_series调用到达那里。