Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/04/2017, 05:10
Avatar de fbedia
fbedia
 
Fecha de Ingreso: julio-2010
Mensajes: 159
Antigüedad: 13 años, 9 meses
Puntos: 8
Problema con ejecución secuencial en Javascript

Hola! Espero que puedan ayudarme porque estoy ya desesperado con este tema....

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
  1. io.on('connection',function(socket) {
  2.     console.log("Nueva conexion al socket");
  3.    
  4.     //SQL para obtener la informacion de los juegos:
  5.     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){
  6.         if(error1) {
  7.             log.error("No pueden obtenerse los datos de los juegos!");
  8.             console.log("ERROR -> "+error1);
  9.             return;
  10.         } else {
  11.             if(!juegos[0]) {
  12.                 //Si no existen juegos emito un succes false
  13.                 socket.emit('juegos',{success: false});
  14.             } else {
  15.                 //Mediante un bucle for recorro los juegos
  16.                 for (var i in juegos) {
  17.                     console.log("Bucle for entra en su ejecucion numero "+i+". El ID del juego es "+juegos[i].id);
  18.                     //Cargo los items del juego
  19.                     db_connection.query('SELECT market_hash_name,icon,value,del_creador FROM juegos_items WHERE id_juego='+juegos[i].id, function(error3,items){
  20.                         if((error3)||(!items[0])) {
  21.                             log.error("Error en la carga de Items de un duelo");
  22.                         } else {
  23.                             console.log("Cargando los items del juego con ID:"+juegos[i].id);
  24.                             //Avatar del oponente:
  25.                             db_connection.query('SELECT realname, avatar FROM usuarios WHERE steamid='+juegos[i].oponente, function(error2,oponente){
  26.                                 if((error2)||(!oponente[0])) {
  27.                                     console.log("Emito los datos del Id juego "+juegos[i].id);
  28.                                     socket.emit('juegos',{
  29.                                         success: true,
  30.                                         gameId: juegos[i].id,
  31.                                         creador: juegos[i].creador,
  32.                                         creador_avatar: juegos[i].avatar,
  33.                                         creador_nick: juegos[i].realname,
  34.                                         oponente: null,
  35.                                         oponente_avatar: null,
  36.                                         oponente_nick: null,
  37.                                         items: items
  38.                                     });
  39.                                 } else {
  40.                                     socket.emit('juegos',{
  41.                                         success: true,
  42.                                         gameId: juegos[i].id,
  43.                                         creador: juegos[i].creador,
  44.                                         creador_avatar: juegos[i].avatar,
  45.                                         creador_nick: juegos[i].realname,
  46.                                         oponente: juegos[i].oponente,
  47.                                         oponente_avatar: oponente[0].avatar,
  48.                                         oponente_nick: oponente[0].realname,
  49.                                         items_creador: items
  50.                                     });
  51.                                 }
  52.                             });
  53.                         }
  54.                     });
  55.                 }
  56.             }
  57.         }
  58.     });
  59.    
  60. });

Mirad el log:



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
__________________
Follow me on twitter @franbedia