【问题标题】: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 执行的函数调用数组中。

【问题讨论】:

  • 我假设您阅读了每个函数的文档?你到底有什么不清楚的地方?

标签: javascript node.js async.js


【解决方案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】:

      类似于 JavaScript 的forEachasync.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的第二个参数传递

      【讨论】:

        猜你喜欢
        • 2014-10-22
        • 2017-11-30
        • 1970-01-01
        • 2020-12-25
        • 2019-07-29
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 2011-02-19
        相关资源
        最近更新 更多