我们怎么知道所有异步操作,所有回调都已完成,并等待它们

时间:2014-11-04 22:49:20

标签: javascript node.js mongodb asynchronous callback

以下代码, 读取包含按类别排序的文档的文件,以及值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);
}); 

问题是我不知道所有异步操作何时结束。 读取过程可以先完成,或者更新过程可以先完成(如果上次更新后要读取的文档很多)。 所以我不知道何时关闭数据库。

我怎么知道所有异步操作和所有回调都已完成,并等待它们。 我读过"承诺"但看起来好像用它来写一些有效和干净的东西。

我发现测试这一小段代码的唯一但不现实的方法是在最后添加一个等待循环。

异步功能似乎将一个非常简单的算法变成了一些深层的困惑。

感谢。

2 个答案:

答案 0 :(得分:1)

我想说你在window.open_procs = 0;中设置了一个全局变量,然后在每个ajax调用开始时递增它,然后在你执行的函数中作为每个ajax调用的结果,递减它。

启动最后一次ajax调用后,在超时时启动观察程序进程,在执行任何操作之前将window.open_procs检查为等于0.

答案 1 :(得分:0)

肯定会推荐学习Promises。 Promise.all()是你在这种情况下要寻找的方法,用于在一系列promises都完成时注册回调。

在npm上有一些mongodb客户端包装器库自动承诺MongoClient请求:

相关: http://taoofcode.net/promise-anti-patterns/