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.nfbind
: nfbind
,而其他的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
。 它也与您的前端无缝集成! 我目前的项目已经取得了成功,只是想用一种新的方法发表意见。
随时以任何理由评论为什么/当你不应该使用云代码; 因为我还没有这样的经历。