我们怎么能知道所有的异步操作,所有的回调都完成了,并等待它们
How can we know that all asynchronous operations, all callback are done, and wait for them
以下代码,读取具有按类别排序的文档和值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);
});
问题是我不知道所有异步操作何时结束。读取过程可以首先完成,或者更新过程可以首先结束(如果上次更新后有许多文档要读取)。所以我不知道什么时候关闭数据库。
我怎么知道所有异步操作和所有回调都完成了,并等待它们呢。我读过关于"承诺"的文章,但用它写一些高效干净的东西看起来很糟糕。
我发现测试这段小代码的唯一但不现实的方法是在末尾添加一个等待循环。
异步特性似乎将一个非常简单的算法变成了一些深深的困惑。
谢谢。
我想说的是,您在window.open_procs = 0;
中设置一个全局变量,然后在每次ajax调用开始时递增,然后在作为每次ajax调用结果执行的函数中递减。
在启动最后一个ajax调用后,在超时后启动观察程序进程,在执行任何操作之前检查window.open_procs是否等于0。
绝对建议学习Promises。在本例中,Promise.all()是您要查找的方法,用于在Promise数组全部完成时注册回调。
npm上有一些mongodb客户端包装库可以自动承诺MongoClient请求:
- https://github.com/Submersible/node-magnolia
- https://www.npmjs.com/package/mongodb-promise
相关:http://taoofcode.net/promise-anti-patterns/
相关文章:
- 我怎么能让jQuery对话框表现得像Javascript警报
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- 我怎么能把一个类嵌套在另一个类中呢
- 我怎么能把这个代码放在移动设备上运行
- 我怎么能把一个错误当作未捕获的错误来记录呢
- DIV怎么能像Javascript中的另一个元素一样工作呢
- 我怎么能用css或(angular)javascript把句子分成两行,只在特定单词后面
- 我怎么能把它做成这样一个图像就不能拖动了
- 我怎么能同时去锚定并打开Bootstrap手风琴呢
- Github上的流星,我怎么能和朋友一起做同一个项目
- 如果没有document.ready(),我怎么能拥有多个javascript函数呢
- 有没有一个javascript库可以生成这样的垂直切片背景图像?如果没有,我怎么能创建它
- 我怎么能在Angular JS中等待,直到我的web服务返回
- 我怎么能"合并”;两个HTML标签
- 我怎么能等待在javascript中执行事件
- 我们怎么能知道所有的异步操作,所有的回调都完成了,并等待它们
- 我怎么能等待谷歌远程呼叫返回我的结果之前继续
- MutationObserver错误:我怎么能等待元素的创建呢?
- 我怎么能等待页面准备在PhantomJS
- Angular:在我在控制器中设置返回值之前,我怎么能等待服务中的承诺被解析呢?