3

我有两个功能:

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)。async.series的简单、基本的实现是什么?我查看了库的代码async(这太棒了),但它是一个旨在做很多事情的库,我在遵循它时遇到了真正的麻烦。

你能告诉我一个简单的 async.series 实现吗?它会简单地一个接一个地调用函数,并且——如果其中一个调用带有错误的回调——用errset 调用最终的回调?

谢谢...

默克。

4

1 回答 1

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调用到达那里的。

于 2012-11-28T08:47:20.163 回答