【发布时间】:2015-12-16 00:18:40
【问题描述】:
这是我正在处理的一段代码:它将 reddit 帖子保存到 mongoDB 集合中。
我正在使用promised-mongo 库
问题是当for循环完成并且所有数据都保存到数据库时,程序没有退出,它继续执行什么都不做,尽管done()在每个promise-mongo承诺链的末尾被调用。
for (var i = 0; i< posts.length; i++) {
posts[i].done = false;
DB.posts.findOne({
"id" : posts[i].id // it's 'id', not mongo's '_id'
})
.then(function(i) {
return function(doc){
if(doc) {
console.log('skipping')
} else {
DB.posts.insert(posts[i]).then(function() {
console.log(arguments);
nSaved++;
});
}
}
}(i))
.catch(function(){
console.log(arguments)
})
.done();
}
我做错了什么?
【问题讨论】:
-
为什么你认为程序需要在“for 循环完成时”退出?仍然有很多打开的回调,每个回调都会触发另一个异步操作 (
insert),并带有自己的回调。 -
这是你的全部程序吗?
nSaved++有什么用?你得到什么输出?你为什么打电话给done()? -
在您关闭
MongoClient连接池(所有更新完成后)之前,您的 node.js 程序不会关闭。你是在哪里做的吗? -
@JohnnyHK 正确!我忘了关闭连接。但是,我不知道如何正确等待 batch job 完成。我更改了我的代码并添加了一个
then,它评估nSaved+nSkipped === nPlanned,如果它是真的则关闭连接;有什么方法可以做得更好? -
@amdc 您可以使用
Q.all或Q.allSettled来协调在一组承诺得到履行后采取的行动。见here。
标签: javascript node.js mongodb promise