javascript - 使用 Node js 进行 2 个异步查询

标签 javascript jquery mysql node.js socket.io

所以我想显示一个包含数据库中所有“房间”的表,我还想显示房间的创建者,但只有用户的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){

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

谢谢你!

最佳答案

发生这种情况是因为当 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);
    });
}

关于javascript - 使用 Node js 进行 2 个异步查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21293069/

相关文章:

javascript - 如何更新图像的来源

javascript - Jquery/javascript 文本动画

php - facebook登录连接mysql

python - sqlalchemy 编码 - 从其他应用程序访问表

mysql - 连接查询来计算记录数计数不正确

javascript - 未捕获的类型错误 : Failed to resolve module specifier "fs". 相对引用必须以 "/"、 "./"或 "../"开头

javascript - jQuery.getScript() 行为

javascript - Bootstrap js 无法在 Eclipse 中使用 jsp 文件

jquery - 使用多选 jQuery 插件时如何更改所选文本

javascript - 如何在运行时删除 jquery 对象?