async.map或async.each与async.parallel有什么不同?
我最近开始研究一个节点项目,并且一直在使用async
库。 我有点困惑,哪个选项会更快。 对某些数据使用async.map
并获取其结果或使用async.each
遍历一个用户数组,并将其相应的操作放入一个我使用async.parallel
执行的函数调用数组中。
与JavaScript的forEach
类似, async.each
接受三个参数,第一个参数是要迭代的数组,第二个参数是应用于数组的每个元素(第一个参数)的函数。 第二个参数的forms是iterator(item, callback)
,其中iterator
是函数的名称, callback
也是一个函数,具有callback(err)
forms,一旦iterator
完成,就会调用这个forms。 ( 注意 :“如果没有错误发生,callback应该运行没有参数或明确的空参数。”) async.each
的第三个参数是一个callback,所有iterator
函数执行后调用,像callback每个迭代器都有formscallback(err)
。
资源
为简洁起见,以下是async.map
参数的async.map
:
-
arr
– 要迭代的数组。 -
iterator(item, callback)
– 应用于arr
每个项目的函数。 迭代器传递一个callback(err, transformed)
函数callback(err, transformed)
,一旦它完成了一个错误(可以是null
)和一个转换后的项目,就必须调用它。 -
callback(err, results)
– 当所有iterator
函数完成或发生错误时调用的callback函数。 结果是来自arr
的已转换项目的数组。
资源
进入你的问题的答案的核心, async.map
映射其第一个参数到一个数组通过调用数组的每个元素,这是它的第一个参数,但async.map 必须返回一个数组 ,而async.each
不。 这反映在async.map
(我指的是results
)的第三个参数的第二个,它必须是一个数组。 也就是说,在最简单的例子中,
async.map([1, 2, 3], function iterator(item, callback_it){ return 2*item; }, callback(err, results))
假设你已经实现了callback_it
和callback
,那么在上面的例子中[2,4,6]将作为callback
的第二个参数被传递
哪个选项会更快
别担心 如果显而易见的话,这个差异将是微不足道的,专用的async
function相当优化。 甚至不要试图拿出你自己的。
在一些数据上使用async.map并获取结果
如果这是你想要做的,使用map
。 在这里你可以用于这个目的,而且非常可读。
使用async.each遍历一个用户数组,并将其相应的操作放入一个函数调用数组中,我使用async.parallel执行。
听起来像个坏主意。 大多数情况下,“把函数放在一个数组中”是一个同步操作,所以你根本不会使用async
,而是使用本地数组forEach
。 或者说,只是
async.parallel(data.map(function(d) { return function(cb) { // do what needs to be done with d and pass cb }; }), function(err, results){ … });
但是,这看起来是非常没有意义的(而且速度async.map
快),而不是直接使用async.map
。
一个区别是async.each和async.map会为您创build任务,将它们推送到任务数组并将这些任务调用为async.parallel。 您不必担心创build任务。
async.map和async.each之间的区别:async.each不允许在callback中获取结果,async.map允许将结果返回到数组中。
- MEAN 2多租户(多个集合保存相互参考)
- 错误:callback已被调用 – asynchronousnode.js oracledb
- async.auto:第一个错误后停止整个链
- 使用Node.js,Async和Formidable进行error handling
- 有关node.js中的async.waterfall的问题
- 当使用瀑布方法时,async.js返回上一个值
- Q.js:如何重写Q.js中的asynchronous系列stream?
- Node + Sequelize:如何在添加之前检查项目是否存在? (asynchronous混淆)
- 如果函数的个数不知道,如何在asynchronous瀑布内迭代