【发布时间】:2014-11-26 09:17:05
【问题描述】:
当mongoose.disconnect() 从未被调用并且节点程序有时间执行所有回调时,我的代码可以工作。当在程序结束时调用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();
}
【问题讨论】:
-
因此异步...您不是在等待任务完成,您有 2 个选择,显而易见的一个是 Dan 提供的,第二个是使用某种计数器来跟踪竞争任务......你可能不想那样做。
-
只是一个小建议;当执行任务出错时,不要将零传递给回调。只传递错误对象。
标签: javascript node.js mongodb async.js