Javascript async.map或async.each与async.parallel之间有什么区别?
我最近开始从事一个节点项目,并且经常使用Javascript async.map或async.each与async.parallel之间有什么区别?,javascript,node.js,async.js,Javascript,Node.js,Async.js,我最近开始从事一个节点项目,并且经常使用async库。我有点困惑,哪种选择会更快。在一些数据上使用async.map并获得结果,或者使用async.each迭代一个用户数组,并将其相应的操作放入一个函数调用数组中,我使用async.parallel执行该函数调用,类似于JavaScript的async。每个包含三个参数,第一个是要迭代的数组,第二个是要应用于数组的每个元素(第一个参数)的函数。第二个参数的形式是iterator(item,callback),其中iterator是函数名,call
async
库。我有点困惑,哪种选择会更快。在一些数据上使用async.map
并获得结果,或者使用async.each
迭代一个用户数组,并将其相应的操作放入一个函数调用数组中,我使用async.parallel
执行该函数调用,类似于JavaScript的async。每个包含三个参数,第一个是要迭代的数组,第二个是要应用于数组的每个元素(第一个参数)的函数。第二个参数的形式是iterator(item,callback)
,其中iterator
是函数名,callback
也是一个函数,形式是callback(err)
,一旦iterator
完成,就会调用它。(注意:“如果没有发生错误,回调应该在没有参数或显式空参数的情况下运行。”)async的第三个参数。每个
都是在执行所有迭代器
函数后调用的回调,与每个迭代器的回调一样,其形式为回调(err)
为简洁起见,以下是async.map
参数的格式:
arr
-要迭代的数组
迭代器(项,回调)
-应用于arr
中每个项的函数。
迭代器被传递一个回调(err,transformed)
,必须调用一次
它已完成,但有一个错误(可以是null
)和一个已转换的项
回调(err,results)
-当所有迭代器
函数已完成,或发生错误。结果是一个数组
从arr
转换的项目
进入问题答案的核心,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\u it
和callback
,那么在上面的示例中[2,4,6]将作为callback
的第二个参数传递
哪种选择更快
别担心。如果差异明显,则可以忽略不计,并且专用的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
毫无意义(而且几乎没有更快)。一个区别是async.each和async.map为您创建任务,将它们放入任务数组并与这些任务并行调用async.parallel。您不必担心任务的创建
async.map和async.each之间的区别:async.each不允许在回调中获取结果,而async.map允许在数组中获取结果。我假设您阅读了每个函数的文档?你到底不清楚什么?