node.jsasynchronous库

有很多图书馆可以帮助确定callback综合症的层次。

其实有太多,我用哪一个?

我使用Async.js 。

Async是一个实用程序模块,它为asynchronousJavaScript提供了直接,强大的function。 虽然最初devise用于node.js,但它也可以直接在浏览器中使用。

例子

async.map(['file1','file2','file3'], fs.stat, function(err, results){ // results is now an array of stats for each file }); async.filter(['file1','file2','file3'], path.exists, function(results){ // results now equals an array of the existing files }); async.parallel([ function(){ ... }, function(){ ... } ], callback); async.series([ function(){ ... }, function(){ ... } ]); 

选一个你喜欢的:P。 我喜欢async例如。 但是Step也很有名。 我觉得有这么多的模块是件好事。 node.js社区正在推出一些非常好的模块。 用NPM安装它们不会花费你任何的努力。

我喜欢使用Q :

如果一个函数不能返回一个值,或者在没有阻塞的情况下抛出一个exception,它可以返回一个promise。 promise是一个表示函数可能最终提供的返回值或抛出的exception的对象。 承诺还可以用作远程对象的代理来克服延迟。

第一遍,承诺可以减轻“末日金字塔”:代码向右行进的速度比向前行进的速度快。

 step1(function (value1) { step2(value1, function(value2) { step3(value2, function(value3) { step4(value3, function(value4) { // Do something with value4 }); }); }); }); 

用承诺图书馆,你可以把金字塔压扁。

 Q.fcall(step1) .then(step2) .then(step3) .then(step4) .then(function (value4) { // Do something with value4 }, function (error) { // Handle any error from step1 through step4 }) .done(); 

使用这种方法,您也会得到隐式的错误传播,就像try,catch,最后一样。 step1中的错误将一直stream向step5,在那里被捕获和处理。

callback方法被称为“控制反转”。 接受callback而不是返回值的函数是“不要打电话给我,我给你打电话”。 Promises不倒置反转,干净地将input参数与控制stream参数分开。 这简化了API的使用和创build,特别是可变参数,rest和扩展参数。

我在其他同步库中遇到的问题是他们经常要求我在开始时定义所有的任务,并且没有提供我find的干净直观的API。 我只是想把任务推到一个组,无论何时何地,然后以并行或串行的方式执行这个组。

我喜欢TaskGroup内部的stream程function,并将其用于许多大型项目,包括DocPad和BugHerd 。 示例在README中。