【问题标题】:How can we know that all asynchronous operations, all callback are done, and wait for them我们怎么知道所有的异步操作,所有的回调都完成了,等待它们
【发布时间】: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


【解决方案1】:

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

在你启动最后一个 ajax 调用之后,然后在执行任何操作之前检查 window.open_procs 是否等于 0 的超时时间启动你的 watcher 进程。

【讨论】:

    【解决方案2】:

    绝对会推荐学习 Promises。 Promise.all() 是您在这种情况下要寻找的方法,用于在一组 Promise 全部完成时注册回调。

    npm 上有一些 mongodb 客户端包装器库可以自动 Promise-ify MongoClient 请求:

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

    【讨论】:

      猜你喜欢
      • 2013-08-10
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多