async.each和async.eachSeries之间的区别

时间:2016-02-07 19:52:11

标签: javascript node.js asynchronous

async.each 是否作为异步数组迭代工作?

async.eachSeries 是否作为同步数组迭代工作?(它实际等待响应)

我问这些是因为它们都有回调但async.each就像异步数组迭代一样工作:

//This is traditional way to iterate an array with callback functions in node.js
//Is this same with async.each ? i want to know it actually.

for (var i = 0; i < data.length; i++) {
 (function (i) {
  request(data[i],function(body){
   console.log(body)
  });
 })(i);

//if this codes and async.each are doing same things , 
//i know that async gives me an aert when all finished thats the difference.

3 个答案:

答案 0 :(得分:9)

您的代码示例与async.each的内容最相似,因为所有异步request调用都是立即进行的,并且允许并行执行。

async.eachSeries的区别在于每次迭代都会等待异步操作完成,然后再启动下一次。

答案 1 :(得分:5)

async.eachSeries()将异步函数应用于数组中的每个项目。

例如,假设您有一个用户列表,每个用户都需要将其配置文件数据发布到远程服务器日志。在这种情况下,顺序很重要,因为数组中的用户已经过排序。

async.eachSeries(users, function(user, callback) {
  user.postProfileToServer(callback);
});

async.each()将异步函数并行应用于数组中的每个项目。

由于此函数并行地将迭代器应用于每个项目,因此无法保证迭代器函数将按顺序完成。

async.each(openFiles, saveFile, function(err){

});

答案 2 :(得分:2)

可以用一个简单的例子来解释差异。

考虑一下,我们有3个文件1.txt, 2.txt, 3.txt。其中文件2.txt的内容约为1GB,所有其他文件都是简单文件,具有最小文件大小。

可以使用1GB

中的以下命令来生成linux/unix文件

为文件2.txt创建1GB的文件 dd if=/dev/zero of=2.txt count=1024 bs=1024

使用的目录结构

.
├── files
│   ├── 1.txt
│   ├── 2.txt
│   └── 3.txt
├── index.js
├── node_modules

执行所需的npm安装,然后尝试不同的每个代码。

对于 AsyncEachSeries

let async = require('async');
const fs  = require('fs');
let files = ['./files/1.txt', './files/2.txt', './files/3.txt'];
async.eachSeries(files, function(file, outCb)
{
   fs.readFile(file, "utf8", (err, data) => {
    console.log(file);
    outCb();
  });
},
function(err)
{
  console.log('all done!!!');
});

输出将为

./files/1.txt
./files/2.txt
./files/3.txt
all done!!!

对于 AsyncEach

async.each(files, function(file, outCb)
{
   fs.readFile(file, "utf8", (err, data) => {
      console.log(file);
      outCb();
  });
},
function(err)
{
  console.log('all done!!!');
});

输出将为

./files/1.txt
./files/3.txt
./files/2.txt
all done!!!
  

结论: AsyncEachSeries 等待每个操作完成   在进入 AsyncEach 并行执行下一步之前,   2.txt的文件大小太大,我们在最后完成了它   只要。希望能弄清差异。