【问题标题】:Make 2 async queries with node js使用节点 js 进行 2 个异步查询
【发布时间】:2014-02-13 02:37:40
【问题描述】:

所以我想在我的数据库中显示一个包含所有“房间”的表,我还想显示房间的创建者,但房间表中只存储了用户的 ID,所以我必须做一个查询用户表。

我试过这样的:

socket.on('room', function() {
    connection.query('SELECT * FROM room', function(err, rows) {
        for(i=0;i<rows.length;i++) {
            var room_name = rows[i].name;
            var room_nbPlayer = rows[i].nbPlayer;
            var room_language = rows[i].language;
            build_user(rows[i].creator, function(res){
                var username = res;
                io.sockets.volatile.emit('broadcast_room', "<tr>" + 
                    "<td>" + room_name + "</td>" + 
                    "<td>" + room_nbPlayer + "</td>" + 
                    "<td>" + room_language + "</td>" + 
                    "<td>" + username + "</td>" +
                    "</tr>");        
            });
        }
    });
});
function build_user(id,callback){
    connection.query('SELECT username FROM user WHERE id ="'+id+'"', function(err, user) {
        var username = user[0].username;
        callback(username);
    });
}

所以,例如,如果我尝试一个

console.log(room_name);

在这个函数之前

build_user(rows[i].creator, function(res){

我得到了所有的名字,但是一旦我输入函数,名字都是一样的,所以最后我的表是错误的。它只获得了正确的用户名,但房间查询中的所有变量总是显示相同的(这是我数据库中的最后一个房间)

谢谢!

【问题讨论】:

    标签: javascript jquery mysql node.js socket.io


    【解决方案1】:

    发生这种情况是因为当 build_user 完成时,您的 for 循环已到达最后一项。 因此,您的 room_name、room_language 等是行中的最后一项。 所以你可以通过回调传递数据来修复它。

    socket.on('room', function() {
        connection.query('SELECT * FROM room', function(err, rows) {
            for(i=0;i<rows.length;i++) {
                build_user(rows[i], function(username, options){
                    var room_name = options.name;
                    var room_nbPlayer = options.nbPlayer;
                    var room_language = options.language;
                    io.sockets.volatile.emit('broadcast_room', "<tr>" +
                        "<td>" + room_name + "</td>" +
                        "<td>" + room_nbPlayer + "</td>" +
                        "<td>" + room_language + "</td>" +
                        "<td>" + username + "</td>" +
                        "</tr>");
                });
            }
        });
    });
    
    function build_user(options,callback){
        var id = options.creator;
        connection.query('SELECT username FROM user WHERE id ="'+id+'"', function(err, user) {
            var username = user[0].username
            callback(username, options);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多