async.map或async.each与async.parallel有什么区别?

时间:2015-05-14 00:40:19

标签: javascript node.js async.js

我最近开始研究一个节点项目,并且一直在使用async库。我有点担心哪个选项会更快。对某些数据使用async.map并获取其结果或使用async.each迭代一组用户并将其相应的操作放入我使用async.parallel执行的函数调用数组中。

3 个答案:

答案 0 :(得分:3)

与JavaScript forEach类似,async.each有三个参数,第一个是迭代的数组,第二个是应用于数组的每个元素的函数(这是第一个参数)。第二个参数的形式为iterator(item, callback),其中iterator是函数的名称,callback也是一个函数,其形式为callback(err),调用一次{{} 1}}完成了。 (注意:"如果没有发生错误,则应该在没有参数或显式空参数的情况下运行回调。")iterator的第三个参数是在执行所有async.each函数后调用的回调,以及每个迭代器的回调都具有iterator形式。

Source

为简洁起见,以下是callback(err)

的参数形式
  • async.map - 要迭代的数组。
  • arr - 应用于iterator(item, callback)中每个项目的功能。 迭代器传递arr,必须调用一次 它已完成错误(可以是callback(err, transformed))和转换项目。
  • null - 所有callback(err, results)时调用的回调 功能已完成,或发生错误。结果是一个数组 转换了iterator
  • 中的项目

Source

通过在每个元素上调用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允许将结果返回到数组中。