javascript - 数据库查询中的异步

标签 javascript node.js asynchronous

我在使用 node.js 时遇到问题。所有人都试图在代码注释中进行描述。

我需要构建一个对话框数组,其中包含有关对话者和最后一个 meggase 的一些信息。

IM = {
    iUserId: false,
    socket: false,
    checkDialog: function(socket) {
        this.socket = socket;
        // Returned [{owner: 123, viewer: 432}]
        var sql = 'SELECT DISTINCT(`owner_user_id`), `viewer_user_id` FROM `phpfox_mail` WHERE `owner_user_id` = ' + this.iUserId + ' GROUP BY 1,2 UNION SELECT DISTINCT (`viewer_user_id`), `owner_user_id` FROM `phpfox_mail` WHERE `viewer_user_id` = ' + this.iUserId + ' GROUP BY 1,2 ORDER BY 1 ';

        connection.query(sql, function(err, rows) {
          if (err) throw err;

          async.map(rows, function(item, nextParent) {
              var sql = 'SELECT `mail_id`, `subject`, `preview`, `owner_user_id`, `viewer_user_id`, `viewer_is_new`, `time_stamp` FROM `phpfox_mail` WHERE (`viewer_user_id` = ' + item.viewer_user_id + ' OR `owner_user_id` = ' + item.viewer_user_id + ') AND (`viewer_user_id` = ' + item.owner_user_id + ' OR `owner_user_id` = ' + item.owner_user_id + ') ORDER BY `mail_id` DESC LIMIT 1';
              var dialogs = [];
              connection.query(sql, function(err, rows) {
              // ???
              });

          }, function(err, item) {
              // Here I have to get the generated array with all the necessary dialogue.
              console.log(item);

              IM.socket.emit('logger', {text: 'dataIsABuilding', key: 'success'});
              IM.socket.emit('dialogsBuilding', item);
          });
        });
    }
};

目标:创建有关消息和对话者的一系列信息。

方案:

  1. 获取包含所有对话者的数组。 [{owner_user_id: 5757、viewer_user_id: 5866}、{etc...}]
  2. 使用第 1 段的结果,从对话中获取有关最新报告的一系列信息。 [{mail_id: 98,主题:test,所有者:5757,查看者:5866,时间戳:123566544},{etc...}]
  3. 获取有关指定标识符 (owner_user_id/viewer_user_id) 的用户的信息。
  4. 将对话的所有数据收集到同一数组中。

我停在第三段了。也就是说,我不知道如何一致地获取前两个数组中的用户信息。

请帮助我!

最佳答案

我不相信您正确使用 async.map 函数。不幸的是,您使用它的方式如此错误,以至于我无法确定您实际上想要做什么。但这里解释了您如何滥用 async.map 函数以及正确使用 async.map 函数。

异步文档中的示例:

async.map(['file1','file2','file3'], fs.stat, function(err, results){
    // results is now an array of stats for each file
});

让我们稍微简化一下。

async.map(someArray, someFunction, someCallBack);

我相信你的问题在于 someFunction 参数。这是您的版本:

function(item, nextParent) {
    var sql = 'SELECT `mail_id`, `subject`, `preview`, `owner_user_id`, `viewer_user_id`, `viewer_is_new`, `time_stamp` FROM `phpfox_mail` WHERE (`viewer_user_id` = ' + item.viewer_user_id + ' OR `owner_user_id` = ' + item.viewer_user_id + ') AND (`viewer_user_id` = ' + item.owner_user_id + ' OR `owner_user_id` = ' + item.owner_user_id + ') ORDER BY `mail_id` DESC LIMIT 1';
    var dialogs = [];
    connection.query(sql, function(err, rows) {
        // ???
    });
}

如果我们查阅 fs.Stat 示例,该参数的函数应该采用两个参数,第一个参数是我们发送到 async.map 的数组中的一个项目。这部分我相信你是对的。然而,第二个参数是一个回调,有两个参数。一个错误和一组结果。这是我认为你搞砸的部分。您应该调用此回调。 async.map 内部提供了回调参数,该回调参数是 async.map 将结果收集到数组中的方式。如果不调用此方法,async.map 将无法收集结果。

我相信你想要的是这样的:

function(item, someCallBackArgument) {
    var sql = 'SELECT `mail_id`, `subject`, `preview`, `owner_user_id`, `viewer_user_id`, `viewer_is_new`, `time_stamp` FROM `phpfox_mail` WHERE (`viewer_user_id` = ' + item.viewer_user_id + ' OR `owner_user_id` = ' + item.viewer_user_id + ') AND (`viewer_user_id` = ' + item.owner_user_id + ' OR `owner_user_id` = ' + item.owner_user_id + ') ORDER BY `mail_id` DESC LIMIT 1';
    var dialogs = [];
    connection.query(sql, function(err, rows) {
        someCallBackArgument(err, rows);
    });
}

关于javascript - 数据库查询中的异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677867/

相关文章:

javascript - XMLHttpRequest onprogress 不触发异步 = false

javascript - 如何从 javascript 打开 JQuery selectmenu 插件?

javascript - 如何编写基于 url 的基本 jquery if 语句

javascript - 如果用户评论太快会弹出验证码?

node.js - NodeJS发布主题时如何传递partitionKey或MessageId?

javascript - Node JS、sqlite3 和 WHERE IN 参数

javascript - 无法处理场景 : No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' 因此不允许访问

c++ - 针对 V8 编译 NodeJs 模块

javascript - 为什么 setTimeout 延迟 0 仍然在 for 循环中的所有其他同步代码之后运行?

javascript - js 异步使用数组 push() shift()