所以我想在我的数据库中显示一个包含所有“房间”的表格,我也想要显示房间的创建者,但是只有用户的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){
我得到了所有的名字,但是一旦我输入这个名字的名字都是一样的,所以最后我的表是错的。它只获得了用户的正确用户名,但是房间查询显示的所有变量总是相同的(这是我数据库中的最后一个房间)
谢谢!
答案 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);
});
}