javascript - 不分阶段工作。正常吗?

标签 javascript node.js

例如,经过一个复杂的循环,从数据库中处理数据并写入某个数组,我需要处理数组中的数据。发生的情况是,没有等待挖矿周期(填充数组)就触发了数组处理的功能。一切都必须通过setTimeout()来完成; 这正常吗?

checkDialog: function (data, callback) {
    var interlocutorsArray = JSON.parse(data);
    var dialogsId = {};
    mongoclient.open(function (err, cursor) {

        var db = cursor.db('messages');
        var dialogsDb = db.collection('dialog');
        interlocutorsArray.forEach(function (item, index) {
            dialogsDb.find({
                owner: item.owner_user_id,
                viewer: item.viewer_user_id
            }, function (err, cursor) {
                cursor.count(function (err, count) {
                    if (count === 0) {
                        dialogsDb.insert({
                            owner: item.owner_user_id,
                            viewer: item.viewer_user_id
                        }, function (err, inserting) {
                            dialogsId[inserting[0]._id] = {
                                owner: item.owner_user_id,
                                viewer: item.viewer_user_id
                            };
                        });
                    } else {
                        cursor.each(function (err, item) {
                            if (item !== null) {
                                dialogsId[item._id] = {
                                    owner: item.owner,
                                    viewer: item.viewer
                                };
                            }
                        });
                    }
                });
            });
        });
    });

    setTimeout((function () {
        callback(dialogsId);
    }), 150);

    console.log('after callback');

}

抱歉我的英语不好!

最佳答案

首先,我建议您从当前的 mongodb 模块切换到更舒适的模块,例如:

我将在示例中使用 monk,因为它可以很容易地适应任何 mongodb 模块,包括 native mongodb node driver .

至于你的问题,你可以用异步控制流管理的任何模块来解决,例如:

下面是使用 async.js 解决问题的示例:

checkDialog: function (data, callback) {
  var db = require('monk')('localhost/messages');
  var dialogsDb = db.get('dialog');
  var interlocutorsArray = JSON.parse(data);

  async.concat(interlocutorsArray, function (item, next) {
    var query = {
      owner: item.owner_user_id
      viewer: item.viewer_user_id
    };
    dialogsDb.find(query, function (err, docs) {
      if (err) return next(err);
      if (docs && docs.length > 0) {
        next(null, docs);
      } else {
        dialogsDb.insert(query, function (err, inserting) {
          next(err, [inserting]);
        })
      }
    })
  }, function (err, items) {
    if (err) throw err; // it's best to handle errors without throwing them
    var dialogsId = {};
    for (var item, i = 0; i < items.length; i++) {
      item = items[i];
      dialogsId[item._id] = {
        owner: item.owner,
        viewer: item.viewer
      };
    }
    callback(dialogsId);
  })
}

关于javascript - 不分阶段工作。正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17628599/

相关文章:

javascript - 如何从弹出选项显示 Ionic 弹出窗口?

javascript - readAsDataURL 多图像上传 ReactJS

javascript - node-postgres:一次更新多条记录

JavaScript、Thymeleaf 和本地化文本

javascript - 使用 JQuery 如何检查是否选中了任何复选框,然后将第一个复选框设置为选中(如果没有)?

javascript - 需要在 Nodejs mssql 验证的变量中保留 promise 结果

node.js - 使用 Controller 内的 Express 和 Multer 解析请求

javascript - Node、Express + Jade 加载脚本一次

linux - Node.js:在同一目录中发送文件

javascript - 在加载所有指定模块之前,我可以检测到 requirejs 何时由于用户导航而生成脚本错误吗?