Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript async.map或async.each与async.parallel之间有什么区别?_Javascript_Node.js_Async.js - Fatal编程技术网

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

Javascript async.map或async.each与async.parallel之间有什么区别?,javascript,node.js,async.js,Javascript,Node.js,Async.js,我最近开始从事一个节点项目,并且经常使用async库。我有点困惑,哪种选择会更快。在一些数据上使用async.map并获得结果,或者使用async.each迭代一个用户数组,并将其相应的操作放入一个函数调用数组中,我使用async.parallel执行该函数调用,类似于JavaScript的async。每个包含三个参数,第一个是要迭代的数组,第二个是要应用于数组的每个元素(第一个参数)的函数。第二个参数的形式是iterator(item,callback),其中iterator是函数名,call

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

执行该函数调用,类似于JavaScript的
async。每个
包含三个参数,第一个是要迭代的数组,第二个是要应用于数组的每个元素(第一个参数)的函数。第二个参数的形式是
iterator(item,callback)
,其中
iterator
是函数名,
callback
也是一个函数,形式是
callback(err)
,一旦
iterator
完成,就会调用它。(注意:“如果没有发生错误,回调应该在没有参数或显式空参数的情况下运行。”)async的第三个参数。每个
都是在执行所有
迭代器
函数后调用的回调,与每个迭代器的回调一样,其形式为
回调(err)


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

  • arr
    -要迭代的数组
  • 迭代器(项,回调)
    -应用于
    arr
    中每个项的函数。 迭代器被传递一个
    回调(err,transformed)
    ,必须调用一次 它已完成,但有一个错误(可以是
    null
    )和一个已转换的项
  • 回调(err,results)
    -当所有
    迭代器
    函数已完成,或发生错误。结果是一个数组 从
    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\u it
callback
,那么在上面的示例中[2,4,6]将作为
callback
的第二个参数传递

哪种选择更快

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

一个区别是async.each和async.map为您创建任务,将它们放入任务数组并与这些任务并行调用async.parallel。您不必担心任务的创建


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

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