Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/09/2013, 06:55
kikeking1
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 15 años, 5 meses
Puntos: 17
Respuesta: callback mi dolor de cabeza

a ver, no es exactamente asi, tu puedes usar la variable en sitio que quieras dentro de su ambito (si es de la funcion, global, etc..) la cuestion es el momento en el que se define la variable.

Node.js es asincronimo, por lo tanto, mientras se esta haciendo alguna "cosa", el programa no se queda bloqueado, si no que continua ejecutando lineas mientras que se realiza esa "cosa", una vez que la "cosa" termina, se dispara el callback.

En tu funcion, cuando haces la consulta en la base de dato, esta consulta supone conectar con la bbdd, hacer la peticion, recibir los resultados. lo que se traduce en un determinado tiempo, pero durante este tiempo, tu programa no se congela esperando los resultados de la base de datos, si no que continua ejecutandose y por lo tanto se llama el console.log que no te muestra los resultados. Y no te lo muestra pues como puedes ver, esta linea se ha ejecutado ante de que la conexion con la base de dato haya terminado, por lo tanto los datos no estan disponibles. Cuando la conexión de la base de dato devuelve respuesta se ejecuta el callback, y aqui ya si es 100% que los datos ya estan recibidos y por lo tanto si se muestra dicha información.

Si quieres te invito a hacer una prueba, añade al console.log de la linea 16 un setTimeout de un parde segundo y ejecuta el codigo, verás que cuando pase estos dos segundo se ejecuta el console.log y muestra el resultado que tu realmente esperabas. Con esto quiero destacarte el hecho de que la variable puedes usarla donde quieras dentro del ambito de esta, lo que tienes que cuidar son los tiempos de ejecución. Esto es solo un ejemplo para que lo veas, NO USES NUNCA setTimeout para esto, pues puede quedarte corto o estar esperando innecesariamente. La magia del callback es precisamente que se ejecuta en el momento apropiado (justo despues de que se obtengan los resultados de la funcion).

Si has usado ajax, el concepto deberia ser mas facil de comprender, tu haces la petición y quedas escuchando el evento cuando llegan los datos.. node es el mismo concepto pero aplicado al evento que tu definas.

...Quizas no me he explicado muy claro, si sigues teniendo dudas, pregunta de nuevo e intento explicarlo de alguna otra forma o con algun ejemplo. Pero creo que lo que es la esencia "los tiempos de ejecución" ha quedado bastante remarcado.

Ya nos cuentas que tal. Un saludo!