2012-11-28 89 views
3

我有两个功能:什么是async.series的简单实现?

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){ 
    ... 
}); 

这里,回调马上打电话(与ERR集),如果一个()返回时走错了路。 什么是easy,async.series的基本实现? 我看了库async(这太棒了)的代码,但它是一个图书馆,意味着做了很多的东西,我遇到了麻烦。

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

谢谢...

芝加哥商业交易所。

回答

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呼叫到达那里。

+1

AAaaaahhhhhhhhhhhhhhh我明白了,100%。哇谢谢你_。我小小的脑袋想着'next'参数必须成为下一个回调......但是不是!它需要是一个快速的功能,只是继续工作!很明显,一旦你看到它......谢谢你! – Merc

+1

它确实需要一些习惯于编写面向事件的代码。但是一旦你习惯了传递和返回函数(我的意思是非常适应它,而不仅仅是理解它),一切都有意义,并且你不再考虑if..else和loop。 – slebetman

+1

任何提示“加快舒适度”的提示?我觉得我真的很努力... – Merc

相关问题