task.js生成器/ promise和asynchronouscallback

我想知道在JavaScript中处理asynchronous代码时,哪两种方法更好。 我想了解哪个方法导致更干净的代码。 我使用的承诺,他们似乎比asynchronous方法( https://github.com/caolan/async )更灵活。

我也知道Task.js库( http://taskjs.org/ ),但这依赖于Ecmascript Harmony的一部分yield关键字。

async库封装了一些非常常见的asynchronous模式,包括并行地进行任意asynchronous调用,并asynchronous遍历列表。 它被devise成与“nodeback” (err, res) API一起工作,这使得它对很多Node.js应用程序很有用。 async是一个具体的解决scheme,它只是简化了包含在库中的asynchronous模式。

相反,诺言在我看来是一个非常普遍的解决asynchronous代码的问题。 它们不仅在乍看之下提供了显而易见的好处,而且使得callback金字塔变得扁平化,否则需要各种复杂模式的async封装可以更简单地解决。

我将通过一些async可用模式的快速浏览来演示这一点。 例如, async.waterfall函数是这样使用的:

 async.waterfall([ function (cb) { asyncCall('argument', cb); }, function(resultOfFirstCall, cb) { anotherCall(resultOfFirstCall, 'someOtherArgument' cb); }, ], function(err, res) { if (err) handle(err); useFinalResult(res); }); 

在大多数promise库(或者至lessQ中没有一个)中,没有与async.waterfall等价的async.waterfall ,因为使用Array.reduce从头开始实现它非常简单 ,就像这样(基于Q的示例,但几乎相同在其他承诺库):

 [ function() { return asyncCall('argument'); }, function(resultOfFirstCall) { return anotherCall(resultOfFirstCall, 'someOtherArgument'); } ].reduce(Q.when, Q()) .then(useFinalResult, handle); 

async的其他大function包括async.parallel ,其中Q包含为Q.all

 // async async.parallel([ asyncFunc, asyncFunc2 ], function(err, res) { if (err) handle(err); useFinalResult(res); // res[0] === asyncFuncResult // res[1] === asyncFunc2Result }); // Q Q.all([ asyncFunc(), asyncFunc2() ]).then(useFinalResult, handle); 

async.map 。 当你使用promise时,你实际上不需要 async.map ,因为正常的Array.map就足够了:

 // async async.map(['file', 'file2', 'file3'], fs.stat, function(err, res) { if (err) handle(err); useFinalResult(res); }); // Q Q.all(['file', 'file2', 'file3'] .map(Q.nfbind(fs.stat))) .then(useFinalResult, handle); 

其余的async同样很容易实现简洁,使用相对简单的承诺库。 (请注意,最后一个例子使用了一个函数Q.nfbindnfbind ,而其他的nf*函数Q提供的基本上都是使用nodeback API的promise,所以甚至没有一个特别大的阻抗来使用库中的promise期待nodeback。)

最后,无论使用promise还是nodeback取决于您,但我认为承诺是一种更加灵活,function强大且通常简洁的方式来实现大多数所有asynchronous操作。

callback是必要的,承诺function是值得一读的更多的信息在这个一般的脉络。

既然你用节点标记你的问题,我build议asynchronous库。 控制stream程function是很好的工作和消除丑陋和难以遵循callback链。 该API设置非常好,用于将节点签名(error, result)后面的callback注入到控制函数中。 它基本上包含在我写的几乎所有的节点脚本中。

虽然您也可以在客户端使用asynchronous,但大多数项目可能不需要。 jQuery包含promise,你可以用它们完成同样的事情。

我认为promise / a和asynchronouslib有不同的目标,承诺关注一步asynchronous操作进度,asynchronous关注多步asynchronous操作,对于节点asynchronous有很多asynchronousapis的使用。

顺便说一句,处理asynchronous操作,使用命名函数而不是匿名函数将是最有效的方法

gumballheadbuild议使用async.js ,但是如果你使用Node, 会推荐使用Parse Cloud Code 。 他们的API已经承诺内置,以及其他好东西(如数据库)。 它节省了时间,您不必担心后端的稳定性。 你可以包含任何NPM模块,只需调整module.exports就可以exports 。 它也与您的前端无缝集成! 我目前的项目已经取得了成功,只是想用一种新的方法发表意见。

随时以任何理由评论为什么/当你不应该使用云代码; 因为我还没有这样的经历。