gpt4 book ai didi

node.js - Node.js async eachLimit 在这种情况下如何工作?

转载 作者:可可西里 更新时间:2023-11-01 09:13:14 29 4
gpt4 key购买 nike

我写了一点async用于将大量 JSON 文件批量插入 MongoDB 分片集群的脚本。这是我第一次使用此模块(我仍在学习 Node.js)。我不知道我这样做对不对。

  • 代码是 waterfall 的最后一部分(一):前面的函数结束使用具有 dbcollfiles 属性的对象。
  • files 数组包含数百个文件路径和函数应用到数组的每个元素也是一个 waterfall (2)。
  • waterfall (2) 由以下部分组成:读取、解析、插入。当这个 waterfall 结束时 (3) 我调用 complete 来完成数组中单个项目的处理,并传递错误(如果有)。

到目前为止一切顺利,对吗?

我无法理解的是 async.eachLimit 回调 (4) 内部发生了什么。来自文档:

A callback which is called after all the iterator functions have finished, or an error has occurred.

也就是说,当所有函数都完成后,next() 调用 (5) 结束脚本。但是根据文档,当发生单个错误时会调用相同的回调 (4)。那是当发生单个文件失败时我的脚本停止。

我怎样才能避免这种情况?

async.waterfall([ // 1
// ...
function (obj, next) {
async.eachLimit(obj.files, 1000,
function (file, complete) {
async.waterfall([ // 2
function (next) {
fs.readFile(file, {}, function (err, data) {
next(err, data);
});
},
function (data, next) { // Parse (assuming all well formed)
next(null, JSON.parse(data));
},
function (doc, next) { // Insert
obj.coll.insert(doc, {w: 1}, function (err, doc) {
next(err);
});
}
], function (err, result) { // 3
complete(err);
});
},
function (err) { // 4
if (err) console.error(err);
next(null, obj); // 5
}
);
}
], function (err, obj) { // Waterfall end
if (err) console.error(err);
obj.db.close(); // Always close the connection
});

最佳答案

如果您不希望它在出现错误时中断,您应该只使用一个虚假的第一个参数调用回调,就像这样(查看//3)。你可以吗/我理解正确吗?

async.waterfall([ // 1
// ...
function (obj, next) {
async.eachLimit(obj.files, 1000,
function (file, complete) {
async.waterfall([ // 2
function (next) {
fs.readFile(file, {}, function (err, data) {
next(err, data);
});
},
function (data, next) { // Parse (assuming all well formed)
next(null, JSON.parse(data));
},
function (doc, next) { // Insert
obj.coll.insert(doc, {w: 1}, function (err, doc) {
next(err);
});
}
], function (err, result) { // 3
if (err) {
console.log(file + ' threw an error');
console.log(err);
console.log('proceeding with execution');
}
complete();
});
},
function (err) { // 4
next(null, obj); // 5
}
);
}
], function (err, obj) { // Waterfall end
if (err) console.error(err);
obj.db.close(); // Always close the connection
});

关于node.js - Node.js async eachLimit 在这种情况下如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440741/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com