Verás tienes que hacer algo más recursivo, no debes hacerlo con un bucle for ya que el bucle te recorrerá todos los valores de los juegos sin esperar a que el resultado de cada juego sea devuelto.
Deberías buscar el resultado de un juego y cuando lo obtengas, entonces buscar el resultado del siguiente y así mientras haya juegos. No sé si me he explicado bien. Te pondré algo a modo de ejemplo simple para que lo veas:
Código Javascript
:
Ver originalif(!juegos[0]) {
//Si no existen juegos emito un succes false
socket.emit('juegos',{success: false});
} else {
//Mediante un bucle for recorro los juegos
//Cargo los items del primer juego, ( el cero es el primer index del array)
cargarDatosJuego( juegos, 0 );
}
function cargarDatosJuego( juegos, i ) {
if ( !juegos[ i ] ) {
console.log("No hay más juegos por cargar");
return false;
}
db_connection.query('SELECT market_hash_name,icon,value,del_creador FROM juegos_items WHERE id_juego='+juegos[i].id, function(error3,items){
if((error3)||(!items[0])) {
log.error("Error en la carga de Items de un duelo");
cargarDatosJuego( juegos, i++ ); // Volvemos a llamar a la función sumando uno al index para cargar el siguiente juego
} else {
console.log("Cargando los items del juego con ID:"+juegos[i].id);
//Avatar del oponente:
db_connection.query('SELECT realname, avatar FROM usuarios WHERE steamid='+juegos[i].oponente, function(error2,oponente){
if((error2)||(!oponente[0])) {
console.log("Emito los datos del Id juego "+juegos[i].id);
socket.emit('juegos',{
success: true,
gameId: juegos[i].id,
creador: juegos[i].creador,
creador_avatar: juegos[i].avatar,
creador_nick: juegos[i].realname,
oponente: null,
oponente_avatar: null,
oponente_nick: null,
items: items
});
} else {
socket.emit('juegos',{
success: true,
gameId: juegos[i].id,
creador: juegos[i].creador,
creador_avatar: juegos[i].avatar,
creador_nick: juegos[i].realname,
oponente: juegos[i].oponente,
oponente_avatar: oponente[0].avatar,
oponente_nick: oponente[0].realname,
items_creador: items
});
}
cargarDatosJuego( juegos, i++ ); // Volvemos a llamar a la función sumando uno al index para cargar el siguiente juego
}
}
}
}
Obviamente es mucho más optimizable, pero esta es la idea, no sé si estará bien escrito o habrá errores, pero bueno eso ya lo miras tu. El caso es que tienes que llamar a la función dentro de la función una y otra vez mientras haya juegos por cargar y cuando no hay más juegos, la detienes.
Es un códifo un tanto lioso y no me he parado a estudiar si hay variables compartidas que también tendrían que estar en la función y demás detalles. No copies y pegues, lo único que intento es pasarte una idea de como hacerlo.