我最近开始了一个节点项目,并且一直在使用async库。我有点困惑,不知道哪个选项会更快。对一些数据使用async.map并获取其结果,或者使用async.each遍历用户数组并将其相应的操作放入我使用async.parallel执行的函数调用数组中。
发布于 2015-05-14 09:27:35
与JavaScript的forEach类似,async.each有三个参数,第一个参数是要迭代的数组,第二个参数是应用于数组中每个元素的函数(即第一个参数)。第二个参数的形式是iterator(item, callback),其中iterator是函数的名称,callback也是一个函数,形式是callback(err),一旦iterator完成就会调用它。(注意:“如果没有发生错误,回调应该在没有参数或显式null参数的情况下运行。”)async.each的第三个参数是在执行所有iterator函数之后调用的回调,与每个迭代器的回调一样,其形式为callback(err)。
为了简洁起见,下面是async.map参数的形式
arr -迭代over.iterator(item, callback)的数组-应用于arr中每一项的函数。向迭代器传递一个callback(err, transformed)和一个转换后的item.callback(err, results) -A回调,一旦完成并返回错误(可以是null),则必须调用该回调,该回调在所有iterator函数完成或发生错误时调用。结果是来自arr.的转换项的数组
进入问题答案的核心,async.map 将其第一个参数映射到一个数组,方法是在数组的每个元素上调用,这是它的第一个参数,但是async.map 必须返回一个数组,而async.each不返回。这反映在async.map (我指的是results)的第三个参数的第二个参数中,该参数必须是一个数组。也就是说,在最简单的例子中,
async.map([1, 2, 3], function iterator(item, callback_it){ return 2*item; }, callback(err, results))假设您已经实现了callback_it和callback,那么在上面的示例中,2、4、6将作为callback的第二个参数传递
发布于 2015-05-14 13:12:27
哪个选项更快
别担心。这种差异即使明显,也是微不足道的,而且专用的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相比,这看起来毫无意义(而且几乎没有速度)。
发布于 2015-12-30 16:32:29
一个不同之处在于,async.each和async.map为您创建任务,将它们推入tasks数组,并使用这些任务调用async.parallel。您不必担心任务的创建。
async.map和async.each之间的区别:async.each不允许在回调中获取结果,而as async.map允许在数组中获取结果。
https://stackoverflow.com/questions/30227494
复制相似问题