Ver Mensaje Individual
  #5 (permalink)  
Antiguo 18/04/2017, 03:25
Avatar de manuparquegiralda
manuparquegiralda
 
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Problema con ejecución secuencial en Javascript

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 original
  1. if(!juegos[0]) {
  2.     //Si no existen juegos emito un succes false
  3.     socket.emit('juegos',{success: false});
  4. } else {
  5.     //Mediante un bucle for recorro los juegos
  6.  
  7.     //Cargo los items del primer juego, ( el cero es el primer index del array)
  8.     cargarDatosJuego( juegos, 0 );
  9. }
  10.  
  11. function cargarDatosJuego( juegos, i ) {
  12.     if ( !juegos[ i ] ) {
  13.         console.log("No hay más juegos por cargar");
  14.         return false;
  15.     }
  16.  
  17.     db_connection.query('SELECT market_hash_name,icon,value,del_creador FROM juegos_items WHERE id_juego='+juegos[i].id, function(error3,items){
  18.         if((error3)||(!items[0])) {
  19.             log.error("Error en la carga de Items de un duelo");
  20.  
  21.             cargarDatosJuego( juegos, i++ ); // Volvemos a llamar a la función sumando uno al index para cargar el siguiente juego
  22.  
  23.         } else {
  24.             console.log("Cargando los items del juego con ID:"+juegos[i].id);
  25.             //Avatar del oponente:
  26.             db_connection.query('SELECT realname, avatar FROM usuarios WHERE steamid='+juegos[i].oponente, function(error2,oponente){
  27.                 if((error2)||(!oponente[0])) {
  28.                     console.log("Emito los datos del Id juego "+juegos[i].id);
  29.                     socket.emit('juegos',{
  30.                         success: true,
  31.                         gameId: juegos[i].id,
  32.                         creador: juegos[i].creador,
  33.                         creador_avatar: juegos[i].avatar,
  34.                         creador_nick: juegos[i].realname,
  35.                         oponente: null,
  36.                         oponente_avatar: null,
  37.                         oponente_nick: null,
  38.                         items: items
  39.                     });
  40.                 } else {
  41.                     socket.emit('juegos',{
  42.                         success: true,
  43.                         gameId: juegos[i].id,
  44.                         creador: juegos[i].creador,
  45.                         creador_avatar: juegos[i].avatar,
  46.                         creador_nick: juegos[i].realname,
  47.                         oponente: juegos[i].oponente,
  48.                         oponente_avatar: oponente[0].avatar,
  49.                         oponente_nick: oponente[0].realname,
  50.                         items_creador: items
  51.                     });
  52.                 }
  53.  
  54.                 cargarDatosJuego( juegos, i++ ); // Volvemos a llamar a la función sumando uno al index para cargar el siguiente juego
  55.  
  56.             }
  57.         }
  58.     }
  59. }

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.
__________________
Diseño Web - Arisman Web