javascript - Node.js async.series() 不等待回调完成

标签 javascript node.js mongodb async.js

mongoose.disconnect() 从未被调用并且 Node 程序有时间执行所有回调时,我的代码可以工作。当在程序结束时调用 mongoose.disconnect() 且连接丢失时,对 mongo 的插入自然不会发生。

此异步不会等待这些插入完成。为什么会这样,我该如何解决?

mObjectList = 准备插入的对象数组

insertMongoObj: function(mObjectList, callback) {
  var tasks = [];

  for (i in mObjectList) {
    tasks.push(mObjectList[i].save());
  }

  async.parallel(tasks, function(err) {
    if (err) {
      callback(err, 0);
    }
  });
  callback(null, tasks.length);
}

感谢您的快速回复!按照建议更改了功能,但还是一样。当连接永远不会关闭并且程序永远不会退出时工作。 Mongoose.disconnect() 仍在这些插入之前关闭连接。

insertMongoObj : function(mObjectList, callback){

    var tasks = [];

    for (i in mObjectList) {
      tasks.push(mObjectList[i].save.bind(mObjectList[i]));
    }

    async.parallel(tasks, function(err) {
        if(err) return callback(err);
        winston.info("  file processing ready");
    });

    return callback();
}
<小时/>

之前的函数调用在这里:

mongoose.connection.once('open', function () {
    talendToMongo.processTalendExport(objPaths, function(){
        mongoose.disconnect();
    });

});

processTalendExport : function(talendEntityLocationList, callback){
    var mongoObjectList = [];
    var self = this;
    for(obj in talendEntityLocationList){
        winston.info("**Start processing directory:" + talendEntityLocationList[obj]);
        var fileList = fs.readdirSync(talendEntityLocationList[obj]);
        this.processEntityDir(talendEntityLocationList[obj], fileList, function(mongoObjectList){
            self.insertMongoObj(mongoObjectList, function(err){
                if(err) {
                    winston.error("  Error processing file:" + talendEntityLocationList[obj]);
                        process.exit(0);
                    } else {
                        winston.info(" Mongo Objects inserted");
                    }
                });
            });
        }
        callback();
    }

insertMongoObj : function(mObjectList, callback){
    var tasks = [];

    for (i in mObjectList) {
        tasks.push(mObjectList[i].save.bind(mObjectList[i]));
    }

    async.parallel(tasks, function(err) {
        if(err) return callback(err);
          winston.info("  file processing ready");
        });

        return callback();
    }

最佳答案

您需要将最后一个回调调用移至 async.parallel 的回调中:

for (i in mObjectList) {
  tasks.push(mObjectList[i].save.bind(mObjectList[i]));
}

async.parallel(tasks, function(err) {
     if (err) {
         return callback(err, 0);
     }
     return callback(null, tasks.length);
 });

关于javascript - Node.js async.series() 不等待回调完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018098/

相关文章:

javascript - 异步并等待 Node js中的MySQL调用

javascript - Node.js 无限循环功能,在某些用户输入时退出

javascript - 查找超过20个用户mongodb

Mongodb图查找

javascript - 如何遍历一组异构元素?

javascript - 如何在 React Native 中渲染从数据库检索的字符串内的换行符?

javascript - 使用 Moment.js 根据时间间隔计算 nextDueDate

javascript - 如何在 MongoDB 聚合中进行 $match 然后在 $group 阶段进行累加

javascript - Lightbox 无法与 Flexslider 一起使用

node.js - 卡在 npm install at fechMetadata 检查可安装状态