async.map 或 async.each 与 async.parallel 有啥区别?
Posted
技术标签:
【中文标题】async.map 或 async.each 与 async.parallel 有啥区别?【英文标题】:What is the difference between async.map or async.each with async.parallel?async.map 或 async.each 与 async.parallel 有什么区别? 【发布时间】:2015-07-25 11:43:47 【问题描述】:我最近开始从事一个节点项目,并且经常使用async
库。我有点困惑哪个选项会更快。对某些数据使用async.map
并获取其结果,或者使用async.each
遍历用户数组并将其相应操作放入我使用async.parallel
执行的函数调用数组中。
【问题讨论】:
我假设您阅读了每个函数的文档?你到底有什么不清楚的地方? 【参考方案1】:一个区别是 async.each 和 async.map 为您创建任务,将它们推送到任务数组中,并使用这些任务调用 async.parallel。您不必担心任务创建。
async.map 和 async.each 的区别:async.each 不允许在回调中获取结果,而 async.map 允许在数组中获取结果。
【讨论】:
【参考方案2】:哪个选项会更快
别担心。如果很明显,差异将可以忽略不计,并且专用的async
功能已经过优化。甚至不要想出你自己的。
在一些数据上使用 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
毫无意义(而且几乎没有更快)。
【讨论】:
【参考方案3】:类似于 javascript 的forEach
,async.each
接受三个参数,第一个是要迭代的数组,第二个是应用于数组每个元素的函数(即第一个参数)。第二个参数的形式是iterator(item, callback)
,其中iterator
是函数的名称,callback
也是一个函数,callback(err)
的形式是在iterator
完成后调用。 (注意:“如果没有发生错误,回调应该在不带参数或显式空参数的情况下运行。”)async.each
的第三个参数是一个回调,在执行完所有iterator
函数,就像每个迭代器的回调都有callback(err)
的形式。
Source
为简洁起见,以下是async.map
的参数形式:
arr
- 要迭代的数组。
iterator(item, callback)
- 应用于arr
中每个项目的函数。
迭代器被传递了一个callback(err, transformed)
,它必须被调用一次
它已完成,但出现错误(可以是 null
)和已转换的项目。
callback(err, results)
- 当所有iterator
时调用的回调
功能已完成,或发生错误。结果是一个数组
从 arr
转换的项目。
Source
得到您问题答案的核心,async.map
映射通过在数组的每个元素上调用 iterator
将其第一个参数映射到数组是它的第一个参数,但 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.map 或 async.each 与 async.parallel 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
async库中的async.map与bluebird的Promise.map有什么区别?
ES6 Promises - 类似 async.each 的东西?
为啥 async.map 函数可以与本机 fs.stat 函数一起使用?