2011-07-11 11 views
6

En el libro de manos en el nodo, el autor da un ejemplo de bloqueo de I \ O,no entienda a la devolución de llamada y el ejemplo de no bloqueo - Node.js

var post = db.query("select * from posts where id = 1"); 
doSomethingWithPost(post) 
doSomethingElse(); 

El autor no dice nada se ejecuta hasta la línea 1 se termina la ejecución de la consulta db

Y, a continuación, se muestra no bloqueante código

callback = function(post){ 
doSomethingWithPost(post) 
} 

db.query("select * from posts where id = 1",callback); 
doSomethingElse(); 

no es éste también el bloqueo hasta que se ejecuta la consulta?

Por lo tanto, doSomethingElse no se ejecutará hasta que se complete la consulta.

Respuesta

2

El autor es absolutamente correcto. Si el segundo ejemplo no es de bloqueo, la ejecución del código desencadenará la consulta y luego continuará ejecutando el resto del código. Se llamará a la función de devolución de llamada una vez que se complete la consulta, en algún punto indeterminado en el futuro. doSomethingElse(); se llamará de inmediato.

Lo que realmente hace que este ejemplo de bloqueo frente a no bloqueo no esté claro en los ejemplos que ha proporcionado. Será algo interno en la implementación de DB. Tal vez al pasar un parámetro de devolución de llamada está indicando que la solicitud debe ser no bloqueante.

Espero que eso ayude, tyler.

+0

Todavía no get..say si 'consulta (String, devolución de llamada) {// implementaion para retreiving registros para la consulta dada la cadena ... hacer que el tiempo para llevar a Ejecutar ... En función de los resultados recuperados, llame a la devolución de llamada} '. Para mí esto también es un bloqueo. A menos que se consulte la base de datos, la devolución de llamada no se ejecutará ... esperaría ... ¡¡¡DERECHO !! – prvn

2

Ryan Dahl's intro es una muy buena visión general, pero this beginner's tutorial is excellent, explica en detalle y de manera amistosa la premisa de las operaciones de no/bloqueo en Javascript (y por lo tanto nodo).

Pero en pocas palabras, el parámetro de devolución de llamada en el segundo ejemplo que ha publicado no se ejecuta hasta que db.query finaliza, se "retiene para más tarde", lo que significa código después de db.query() la llamada puede continuar ejecutándose.

6

Siempre debe leer las funciones sin bloqueo como doRealStuff(params, callback) como "poner doRealStuff, params y callback en la cola, do callback() cuando se llega a la cola final". Esto también puede ayudar a evitar hacer errores como

for (var i=0; i < 1000000; i++) 
{ 
    // I want to do many http requests now 
    do_request(test_url); 
} 

// not a single byte is sent here because event loop was blocked by for loop 
+0

buen ejemplo :) – danjah

+1

También hay una buena frase explicativa asíncrona que flota desde Nodebeginner: "En el nodo, todo se ejecuta en paralelo, excepto el código" - http://nodebeginner.org/index.html –

Cuestiones relacionadas