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

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

我编写了一个小脚本,将大量JSON文件批量插入MongoDB分片集群。这是我第一次使用这个模块(我还在学习Node.js)。我不知道我做得对不对

  • 代码是瀑布(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
?很好,很抱歉是我的错误!谢谢再见!介意我在这个问题上请你帮忙吗?所有回调都缺少返回语句。