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.
答案 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
的文件大小太大,我们在最后完成了它 只要。希望能弄清差异。