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

[SOLUCIONADO] problema de callback !!!! :( , Explicacion de promesas

Estas en el tema de problema de callback !!!! :( , Explicacion de promesas en el foro de Node.js en Foros del Web. Hola chicos que tal como estan tengo un problema y es que estoy haciendo consultas en mysql con node y pues me di de cuenta ...
  #1 (permalink)  
Antiguo 19/09/2013, 20:32
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 11 meses
Puntos: 2
problema de callback !!!! :( , Explicacion de promesas

Hola chicos que tal como estan tengo un problema y es que estoy haciendo consultas en mysql con node y pues me di de cuenta que este da los resultados de la consulta por medio de un callback. Con una sola consulta no hay problema pero necesito hacer mas consultas dentro de esa consulta y pues ahi viene el problema por que el callback es asincrono y este ejecuta bn solo la consulta que esta en esta dentro de la otra. Escuche algo como promesas pero todabia no logro entender bn como es su funcionamiento. Aqui el codigo:

Código Javascript:
Ver original
  1. function histori(dato, callback){//una  funcion que se llama desde un socket.on (servidor)
  2.     var historias={}, userObj={};// variables de prueba ṕero no funciono
  3.     var usuario=dato.meet.substring(17).substring(0,dato.longs.substring(8));
  4.     timeLine(conexion, usuario, function(a){//prime callback******************************
  5.         for (var i = 0; i < a.length; i++){//hago un for para recorrer todo el resultado de la consulta anterior
  6.             var historia=a[i].historia;//asigno para que no hayan futuros errores coo undefined
  7.             slt.selectEspecific(conexion, ['nick', 'nombres'], 'usuario', 'cod', a[i].seguido, 'cod', '', 0, 1, function(user){//segundo callback************************************
  8.                 console.log(historia+' de '+user[0].nick);
  9.                 //userObj=user;
  10.             });
  11.         };
  12.     });
  13.     console.log(historias);//muestra {}
  14.     callback(null);
  15. }

el resultado muestra:

Código p:
Ver original
  1. {}
  2. Olle Bratt Pit no eres mi padre!!!  fuck yeah de SonickSeven
  3. Olle Bratt Pit no eres mi padre!!!  fuck yeah de noa2
  4. Olle Bratt Pit no eres mi padre!!!  fuck yeah de SonickSeven
  5. Olle Bratt Pit no eres mi padre!!!  fuck yeah de SonickSeven
  6. Olle Bratt Pit no eres mi padre!!!  fuck yeah de marbel93

si se dan de cuenta es siempre la misma historia (primera consulta) la que si cambia es la segunda consulta (el usuario)

la verdad es la primera vez que me encuentro con este error y alguien me dio me dijo esto pero no pude enterder en ese entonces lo que queria decir. :( y ahora no me responde (seguro esta ocupado) el problema es que node trabaja con callbacks para arriba y para abajo osea que si no soluciono esto no podre con node
  #2 (permalink)  
Antiguo 20/09/2013, 23:35
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 12 años, 3 meses
Puntos: 17
Respuesta: problema de callback !!!! :( , Explicacion de promesas

Que estas usando , modulo mysql ? si es asi puedes hacer múltiples consultas habilitando el parámetro multistatement..

ejemplo:

Código:
var query = 'SELECT * FROM tabla_ejemplo WHERE loquebusco = ' + this.mysql.escape(nose) + ';'
			+'SELECT * otra_tabla = '+ this.mysql.escape(estavariable) + ' ';
			this.mysql.query(query , function( err, rows){
				console.log(rows);
			}
en el callback de rows trabajas lo demas... pero multistatement debe estar habilitado.... que en tu caso como es asincronico no tienes los datos para continuar..

Pero si lo tienes que escalonar asi.. porque no usas modulo mysql , retorna un objeto con todo tu trabajo en el callback... de tu funcion principal..
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com

Última edición por utan; 21/09/2013 a las 00:38
  #3 (permalink)  
Antiguo 22/09/2013, 09:53
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 11 meses
Puntos: 2
Respuesta: problema de callback !!!! :( , Explicacion de promesas

ya lo solucione. Pero te digo lo siguiente:
Si uso modulo mysql y pues como yo lo llevaba era mas a o menos como era solo que con un for como el que tengo no se podia hacer. (por que? Pues me explico (quien me ayudo) que aveces a[1 no siempre era posicion actuaal donde estaba el dato que yo creia]) y pues que para eso es mejor hacerlo con la funcion .forEach(); . Ahora lo que tu dices la verdad hasta ahora lo veo pero me parecio algo complicado ya que si vez son dos consultas que no se pueden hacer juntas pues muestran error (o eso creo.... es mal complicado). Tendre en cuanta eso que dices :D. Ahora la solucion:
Código Javascript:
Ver original
  1. function histori(dato, callback) {
  2.     var usuario = dato.meet.substr(17).substr(0, dato.longs.substr(8));
  3.     var historias = [], userObj = [];
  4.     timeLine(conexion, usuario, function(a) {
  5.         var loop = a.length, count = 0
  6.         a.forEach(function(ele, ind){// se hace un foreach para recorrer el array ind es el indice y ele es el cotenido
  7.             var historia = ele.historia;
  8.             slt.selectEspecific(conexion, ['nick', 'nombres'], 'usuario', 'cod', ele.seguido, 'cod', '', 0, 1, function (user){
  9.                 //console.log('%s de %s', historia, user[0].nick)
  10.                 userObj[ind] = user
  11.                 if (loop == count){//cuando los dos son iguales se envia el callback
  12.                     //callback(userObj)
  13.                 }
  14.                 count++//se incrementa el valor por cada ciclo
  15.             });
  16.         });
  17.     });
  18. }

de esta forma si sale bn !! primera historia con su respectivo creador, segunda historia con su respectivo creador, y sucesivamente :D

Etiquetas: callback, funcion, javascript, select
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 11:27.