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

12

我最近开始做一个node项目,经常使用async库。我现在有点困惑,不知道哪种选项更快。是使用async.map来处理一些数据并获取其结果,还是使用async.each遍历用户数组,并将其对应的操作放入函数调用数组中,再使用async.parallel执行这些函数调用。


我假设你已经阅读了每个函数的文档?你到底不清楚什么? - Bergi
3个回答

3
类似于JavaScript的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_itcallback,那么在上面的示例中,[2, 4, 6]将作为callback的第二个参数传递。

1
一点区别是 async.each 和 async.map 会为您创建任务,将它们推入任务数组并使用这些任务调用 async.parallel。您不必担心任务创建。
async.map 和 async.each 的区别:async.each 不允许在回调函数中获取结果,而 async.map 允许在数组中获取结果。

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 没有多大意义(而且几乎没有更快的速度)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接