Se trata de una aplicación que estoy haciendo con NodeJS que como sabrán se programa en javascript. Pues bien, el problema es el siguiente:
Se trata de una aplicación donde un usuario crea un juego y otro usuario puede unirse.
El creador y el oponente añaden una serie de "items" que se disputarán.
Cuando un usuario se conecta, lo que quiero hacer es cargar los juegos y mostrarselos.... Lo que hago es:
1º: Una consulta SQL que me devuelva los juegos activos.
2º: Mediante un bucle for, voy recorriendo el resultado de la consulta que contiene los IDs
3º: Dentro del buble for, realizo otra consulta para obtener los items depositados... y a continuacion procedo mediante socket.emit a enviar la informacion.
El problema esta en que el buble for no espera a que se ejecute lo que hay dentro de el! ¿Que puedo hacer? ¿Alguna idea?
El codigo es el siguiente:
Código Javascript:
Ver original
io.on('connection',function(socket) { console.log("Nueva conexion al socket"); //SQL para obtener la informacion de los juegos: db_connection.query('SELECT juegos.id, juegos.creador, usuarios.avatar, usuarios.realname FROM juegos, usuarios WHERE juegos.creador=usuarios.steamid ORDER BY finalizado ASC, fecha_fin DESC LIMIT 0,100', function(error1,juegos){ if(error1) { log.error("No pueden obtenerse los datos de los juegos!"); console.log("ERROR -> "+error1); return; } else { if(!juegos[0]) { //Si no existen juegos emito un succes false socket.emit('juegos',{success: false}); } else { //Mediante un bucle for recorro los juegos for (var i in juegos) { console.log("Bucle for entra en su ejecucion numero "+i+". El ID del juego es "+juegos[i].id); //Cargo los items del juego 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"); } 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 }); } }); } }); } } } }); });
Mirad el log:
![](https://i.gyazo.com/e5e7cc0fd6bacec9d1a4f2a299c79b4b.png)
Bucle for entra en su ejecucion numero 0. El ID del juego es 1
Bucle for entra en su ejecucion numero 1. El ID del juego es 2
Cargando los items del juego con ID:2
Cargando los items del juego con ID:2
Emito los datos del Id juego 2
Emito los datos del Id juego 2
Quiero que el codigo se ejecute secuencialmente... El log deberia mostrar algo asi:
Bucle for entra en su ejecucion numero 0. El ID del juego es 1
Cargando los items del juego con ID:1
Emito los datos del Id juego 1
Bucle for entra en su ejecucion numero 1. El ID del juego es 2
Cargando los items del juego con ID:2
Emito los datos del Id juego 2
Espero haberme explicado bien!
Cualquier duda muy gustosamente tratare de aclararla.
Muchas gracias por vuestro tiempo