Node.js async eachLimit在这种情况下是如何工作的?
我编写了一个小脚本,将大量JSON文件批量插入MongoDB分片集群。这是我第一次使用这个模块(我还在学习Node.js)。我不知道我做得对不对Node.js async eachLimit在这种情况下是如何工作的?,node.js,mongodb,asynchronous,callback,asynccallback,Node.js,Mongodb,Asynchronous,Callback,Asynccallback,我编写了一个小脚本,将大量JSON文件批量插入MongoDB分片集群。这是我第一次使用这个模块(我还在学习Node.js)。我不知道我做得对不对 代码是瀑布(1)的最后一部分:前面的函数结束 创建具有db、coll和文件属性的对象 文件数组包含数百个文件路径和 同样,应用于数组的每个元素的是瀑布(2) 瀑布(2)由以下部分组成:读取、解析、插入。当这个瀑布结束时(3),我调用complete来完成对数组中单个项的处理,并传递错误(如果有) 到目前为止还不错,对吗 我不明白的是async.ea
- 代码是瀑布(1)的最后一部分:前面的函数结束
创建具有
、db
和coll
文件属性的对象
数组包含数百个文件路径和 同样,应用于数组的每个元素的是瀑布(2)文件
- 瀑布(2)由以下部分组成:读取、解析、插入。当这个瀑布结束时(3),我调用
来完成对数组中单个项的处理,并传递错误(如果有)李>complete
async.eachLimit
回调函数(4)中发生了什么。从文件中:
在所有迭代器函数完成后调用的回调函数
已完成,或发生错误
也就是说,当所有函数都完成时,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
});
如果您不希望它在发生错误时中断,那么应该使用falsy first参数调用回调,如下所示(注意//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
});
看起来合法,但不起作用。执行回调4,并在出现第一个错误时立即退出脚本。我遗漏了什么吗?所以你调用的是没有参数的
complete
?很好,很抱歉是我的错误!谢谢再见!介意我在这个问题上请你帮忙吗?所有回调都缺少返回语句。