【发布时间】:2016-09-12 15:06:00
【问题描述】:
以下代码, 读取包含按类别排序的文档和值 desc 的文件, 并修改每个类别价值最高的文档。
下面是代码:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://WRKHAL02:27017/test', function(err, db) {
if(err) throw err;
function (cbUpdate(err,updated) {
if(err) throw " \n cbUpdate \n" + err;
console.log(" Successfully updated " + updated + " Document");
}
var theFile = db.collection("theFile");
var cursor = theFile.find({});
cursor.sort([["State",1],["Temperature",-1]]);
currentState = "empty";
cursor.each(function(err,doc) {
if(err) throw " \n -*- cursor.each error -*- \n" + err;
if (doc == null) {
console.log(" \n doc == null ; End Of File \n ");
here use to be the db.close();
}
else {
if (currentState != doc.State) {
console.log(doc._id);
console.log(doc.State);
console.log(doc.Temperature);
var myquery = {};
myquery['_id'] = doc['_id'];
var myupdate = {$set:{"month_high":true}};
theFile.update(myquery, myupdate, cbUpdate);
currentState = doc.State;
}
}
});
setTimeout(function() {
console.log(" TimeOut ");
db.close();
}, 3000);
});
问题是我不知道所有异步操作何时结束。 读取过程可以先完成,也可以先完成更新过程(如果在最后一次更新后有很多文档要读取)。 所以我不知道什么时候关闭数据库。
我怎么知道所有异步操作和所有回调都完成了,等待它们。 我读到了“promise”,但用它来写一些高效和干净的东西看起来很糟糕。
我发现测试这段代码的唯一但不现实的方法是在最后添加一个等待循环。
异步功能似乎将一个非常简单的算法变成了一些深层次的困惑。
谢谢。
【问题讨论】:
-
有一个用零初始化的计数器,在调用
.update()之前递增它并在更新回调中递减。零计数器 == 完成所有异步操作。 -
使用 Promise 或
async模块。
标签: javascript node.js mongodb asynchronous callback