Foros del Web » Programando para Internet » Node.js »

[SOLUCIONADO] ¿Porqué siempre me coge la misma id?

Estas en el tema de ¿Porqué siempre me coge la misma id? en el foro de Node.js en Foros del Web. Hola, estoy intentando hacer que por cada zona que existe inserte todos los objetos que hay si no existen ya. El problema que tengo es ...
  #1 (permalink)  
Antiguo 20/06/2013, 10:45
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 3 meses
Puntos: 9
¿Porqué siempre me coge la misma id?

Hola, estoy intentando hacer que por cada zona que existe inserte todos los objetos que hay si no existen ya. El problema que tengo es que hay 2 objetos y teóticamente tendría que insertar 20 de cada, y me inserta en total 40, hasta ahí bien. Pero me los inserta todos con la misma id, la última. No entiendo porqué sucede, he llegado a pensar que el bucle for se ejecuta antes que el do que tiene dentro..

Código Javascript:
Ver original
  1. client.query("SELECT id FROM world_areas", function(errors, rows) {
  2.     for(var i = 0;i < rows.length; i++) {
  3.         var map = rows[i].id;
  4.    
  5.         client.query('SELECT * FROM objects WHERE regeneration = "1"', function(errors, rows) {
  6.            
  7.             for(var e = 0;e < rows.length; e++) {
  8.            
  9.                 var max_objects = rows[e].max_objects;
  10.                 var name = rows[e].name;
  11.                 var ammount = rows[e].ammount;
  12.                 var type = rows[e].id;
  13.                 client.query('SELECT id FROM world_objects WHERE type = "' + type + '" AND map = "' + map + '"', function(errors, rows) {
  14.                     var dif = parseInt(max_objects)-rows.length;
  15.                     var a = 0;
  16.                     do {
  17.                         var x = 1100 + Math.floor(Math.random() * 3600);
  18.                         var y = 1100 + Math.floor(Math.random() * 3600);
  19.                         client.query('INSERT INTO world_objects (name, type, map, x, y) VALUES ("' + name + '", "' + type + '", "' + map + '", "' + x + '", "' + y + '")');
  20.                         a++;
  21.                         console.log('OBJETO[' + a + '] => ' + type );
  22.                     }while(a < dif);
  23.                            
  24.                 });
  25.                
  26.             }
  27.         });
  28.    
  29.    
  30.        
  31.         console.log(' [' + date + '] -> GENERADOS OBJETOS EN EL MAPA ' + rows[0].id);
  32.     }
  33. });

¿Alguna idea?
  #2 (permalink)  
Antiguo 20/06/2013, 16:00
Avatar de chwc  
Fecha de Ingreso: julio-2008
Ubicación: Buenos Aires ! :D
Mensajes: 814
Antigüedad: 15 años, 8 meses
Puntos: 103
Respuesta: ¿Porqué siempre me coge la misma id?

Hola ! primero que nada no se en donde esta el problema, pero lo que si que nunca le asignas los datos a objeto[ ] dentro del bucle, solo lo agregas a una BD

Estas haciendo un juego no ? me encanta la idea :D
__________________
Hangouts de JavaScript todos los jueves 20hs GMT, Unite !
https://plus.google.com/u/0/108504944676960830886
  #3 (permalink)  
Antiguo 20/06/2013, 16:05
Avatar de chwc  
Fecha de Ingreso: julio-2008
Ubicación: Buenos Aires ! :D
Mensajes: 814
Antigüedad: 15 años, 8 meses
Puntos: 103
Respuesta: ¿Porqué siempre me coge la misma id?

Mira, de todos modos te recomiendo que no abuses de mysql ni de ninguna BD, te vas a volver loco. trata de utilizarlo solo para almacenar backups del estado del juego, es mejor tener todos los datos a mano en la memoria ram.

es decir, hacer una especie de BD con javascript, con objetos, para asi no tener que lidiar con los callbacks de las bases de datos ( son todas, redis, mongoBD, mysql, etc.. ) y ademas, obviamente agilizar todo

es solo una opinion
__________________
Hangouts de JavaScript todos los jueves 20hs GMT, Unite !
https://plus.google.com/u/0/108504944676960830886
  #4 (permalink)  
Antiguo 20/06/2013, 16:32
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 3 meses
Puntos: 9
Respuesta: ¿Porqué siempre me coge la misma id?

Hola, si es un juego.

Lo que pasa es que esta función la utilizo para cuando inicio el servidor para que se reestablezcan todos los objetos en cada mapa.

La variable "object" proviene de una función, te paso el codigo completo:

Código Javascript:
Ver original
  1. client.query("SELECT id FROM world_areas", function(errors, rows) {
  2.     for(var i = 0;i < rows.length; i++) {
  3.         var map = rows[i].id;
  4.    
  5.         client.query('SELECT * FROM objects WHERE regeneration = "1"', function(errors, rows) {
  6.            
  7.             for(var e = 0;e < rows.length; e++) {
  8.            
  9.                 var max_objects = rows[e].max_objects;
  10.                 var name = rows[e].name;
  11.                 var ammount = rows[e].ammount;
  12.                 var type = rows[e].id;
  13.                 client.query('SELECT id FROM world_objects WHERE type = "' + type + '" AND map = "' + map + '"', function(errors, rows) {
  14.                     var dif = parseInt(max_objects)-rows.length;
  15.                     var a = 0;
  16.                     do {
  17.                         var x = 1100 + Math.floor(Math.random() * 3600);
  18.                         var y = 1100 + Math.floor(Math.random() * 3600);
  19.                         client.query('INSERT INTO world_objects (name, type, map, x, y) VALUES ("' + name + '", "' + type + '", "' + map + '", "' + x + '", "' + y + '")');
  20.                         a++;
  21.                         console.log('OBJETO[' + a + '] => ' + type );
  22.                     }while(a < dif);
  23.                            
  24.                 });
  25.                
  26.             }
  27.         });
  28.    
  29.    
  30.        
  31.         console.log(' [' + date + '] -> GENERADOS OBJETOS EN EL MAPA ' + rows[0].id);
  32.     }
  33. });

Funcionar funciona, porque lee cada mapa, y lee cada objeto.

Si pongo un console.log con la id dentro del for de la tabla objetos me devuelve las id correctamente, pero si coloco en console.log dentro del do, me devuelve la misma id todo el rato

Es como si se estuviera sobrescribiendo la id por el ultimo registro

Última edición por SeaPirates; 20/06/2013 a las 17:00
  #5 (permalink)  
Antiguo 21/06/2013, 16:06
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: ¿Porqué siempre me coge la misma id?

buenas...
no he podido interpretar bien todo el código pero se me ocurre que puede ser el problema clásico de los bucles y los eventos asíncronos. recuerda que la mayoría de los componentes en nodejs son asíncronos. a esto sumale que javascript es late-binding. lo que más o menos quiere decir que javascript obtiene los valores al momento de invocarlos. de modo que si esa variable cambia, eventualmente se reflejará. tienes que hacer una especie de bind con closure porque creo que con bind no te funcionará.

básicamente en el bucle creas una función a la que le pasas como argumento el iterador y dentro de esta función utilizas ese argumento para los callbacks.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: bucles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:44.