使用节点js进行2次异步查询

时间:2014-01-22 20:16:00

标签: 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){

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

谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为在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);
    });
}