async.map 或 async.each 与 async.parallel 有啥区别?

Posted

技术标签:

【中文标题】async.map 或 async.each 与 async.parallel 有啥区别?【英文标题】:What is the difference between async.map or async.each with async.parallel?async.map 或 async.each 与 async.parallel 有什么区别? 【发布时间】:2015-07-25 11:43:47 【问题描述】:

我最近开始从事一个节点项目,并且经常使用async 库。我有点困惑哪个选项会更快。对某些数据使用async.map 并获取其结果,或者使用async.each 遍历用户数组并将其相应操作放入我使用async.parallel 执行的函数调用数组中。

【问题讨论】:

我假设您阅读了每个函数的文档?你到底有什么不清楚的地方? 【参考方案1】:

一个区别是 async.each 和 async.map 为您创建任务,将它们推送到任务数组中,并使用这些任务调用 async.parallel。您不必担心任务创建。

async.map 和 async.each 的区别:async.each 不允许在回调中获取结果,而 async.map 允许在数组中获取结果。

【讨论】:

【参考方案2】:

哪个选项会更快

别担心。如果很明显,差异将可以忽略不计,并且专用的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 毫无意义(而且几乎没有更快)。

【讨论】:

【参考方案3】:

类似于 javascriptforEachasync.each 接受三个参数,第一个是要迭代的数组,第二个是应用于数组每个元素的函数(即第一个参数)。第二个参数的形式是iterator(item, callback),其中iterator是函数的名称,callback也是一个函数,callback(err)的形式是在iterator完成后调用。 (注意:“如果没有发生错误,回调应该在不带参数或显式空参数的情况下运行。”)async.each 的第三个参数是一个回调,在执行完所有iterator 函数,就像每个迭代器的回调都有callback(err) 的形式。

Source


为简洁起见,以下是async.map 的参数形式:

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

Source


得到您问题答案的核心,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的第二个参数传递

【讨论】:

以上是关于async.map 或 async.each 与 async.parallel 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

async库中的async.map与bluebird的Promise.map有什么区别?

ES6 Promises - 类似 async.each 的东西?

为啥 async.map 函数可以与本机 fs.stat 函数一起使用?

如何模拟这个以继续 async.each() 调用

跳出 javascript 嵌套的 async.each 循环,但继续主循环

node.js async.each 回调,我怎么知道它啥时候完成?