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_itcallback ,那么在上面的例子中[2,4,6]将作为callback的第二个参数被传递

哪个选项会更快

别担心 如果显而易见的话,这个差异将是微不足道的,专用的asyncfunction相当优化。 甚至不要试图拿出你自己的。

在一些数据上使用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允许将结果返回到数组中。