我最近开始做一个node项目,经常使用async
库。我现在有点困惑,不知道哪种选项更快。是使用async.map
来处理一些数据并获取其结果,还是使用async.each
遍历用户数组,并将其对应的操作放入函数调用数组中,再使用async.parallel
执行这些函数调用。
我最近开始做一个node项目,经常使用async
库。我现在有点困惑,不知道哪种选项更快。是使用async.map
来处理一些数据并获取其结果,还是使用async.each
遍历用户数组,并将其对应的操作放入函数调用数组中,再使用async.parallel
执行这些函数调用。
forEach
, async.each
有三个参数,第一个是要迭代的数组,第二个是要应用于数组中每个元素的函数(即第一个参数)。第二个参数的形式是iterator(item, callback)
,其中iterator
是函数的名称,callback
也是一个函数,其形式为callback(err)
,该函数在iterator
完成后被调用。(注意:“如果没有出现错误,则必须不带参数或带有显式空参数运行回调。”)async.each
的第三个参数是一个回调函数,在所有iterator
函数执行完后被调用,并且与每个迭代器的回调一样,具有callback(err)
的形式。
async.map
的参数表单,为简洁起见:
arr
- 要迭代的数组。iterator(item, callback)
- 适用于arr
中每个项目的函数。
迭代器传递了一个callback(err, transformed)
,必须在完成后调用该回调,
其中包含一个错误(可以为null
)和一个转换后的项目。callback(err, results)
- 当所有iterator
函数完成或发生错误时调用的回调。
结果是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_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
没有多大意义(而且几乎没有更快的速度)。