我最近开始研究一个节点项目,并且一直在使用async
库。我有点担心哪个选项会更快。对某些数据使用async.map
并获取其结果或使用async.each
迭代一组用户并将其相应的操作放入我使用async.parallel
执行的函数调用数组中。
答案 0 :(得分:3)
与JavaScript forEach
类似,async.each
有三个参数,第一个是迭代的数组,第二个是应用于数组的每个元素的函数(这是第一个参数)。第二个参数的形式为iterator(item, callback)
,其中iterator
是函数的名称,callback
也是一个函数,其形式为callback(err)
,调用一次{{} 1}}完成了。 (注意:"如果没有发生错误,则应该在没有参数或显式空参数的情况下运行回调。")iterator
的第三个参数是在执行所有async.each
函数后调用的回调,以及每个迭代器的回调都具有iterator
形式。
为简洁起见,以下是callback(err)
:
async.map
- 要迭代的数组。arr
- 应用于iterator(item, callback)
中每个项目的功能。
迭代器传递arr
,必须调用一次
它已完成错误(可以是callback(err, transformed)
)和转换项目。null
- 所有callback(err, results)
时调用的回调
功能已完成,或发生错误。结果是一个数组
转换了iterator
。通过在每个元素上调用arr
,找到问题答案的核心,async.map
将 第一个参数映射到数组数组的第一个参数,但是async.map 必须返回一个数组,而iterator
则没有。这反映在async.each
的第三个参数中的第二个(我指的是async.map
),它必须是一个数组。也就是说,在最简单的例子中,
results
假设您已经实施了async.map([1, 2, 3], function iterator(item, callback_it){ return 2*item; }, callback(err, results))
和callback_it
,那么在上面的示例中[2,4,6]将作为callback
答案 1 :(得分:1)
不要担心。如果显而易见,差异将是微不足道的,并且专用的哪个选项会更快
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
相比,这看起来毫无意义(而且速度更快)。
答案 2 :(得分:1)
一个区别是async.each和async.map为您创建任务,将它们推送到tasks数组并使用这些任务调用async.parallel。您不必担心创建任务。
async.map和async.each:async.each之间的区别不允许在回调中获取结果,因为async.map允许将结果返回到数组中。