2012-01-16 17 views
8

Aquí hay una pregunta sobre lo que creo que sería un patrón simple en el nodo js.Cómo esperar en Node.js

Aquí está mi ejemplo en CoffeeScript:

db_is_open = false 

db.open -> 
    db_is_open = true 

wait = -> 
wait() until db_is_open 

Y aquí de nuevo en javascript:

var db_is_open = false; 

db.open(function() { 
    db_is_open = true; 
}); 

function wait() {}; 
while (not db_is_open) { wait()}; 

Esto no funciona en absoluto, porque el bucle mientras que nunca abandona el control, lo que supongo que tiene sentido . Sin embargo, ¿cómo puedo decirle a la función de espera que pruebe la siguiente devolución de llamada en la cola?

+3

No se puede esperar, sólo se puede utilizar devoluciones de llamada – Raynos

+2

que son básicamente preguntando cómo escribir código de Node.js asíncrono de forma sincrónica, que es un tema caliente con un montón de nuevos proyectos e ideas. Revise este enlace, sin embargo son toneladas: http://stackoverflow.com/questions/5139381/node-js-async-libs – tokland

Respuesta

2

¿Por qué estás esperando y no solo usando una devolución de llamada que se ejecuta dentro de la función pasada al db.open? Esto es más o menos código Nodo idiomática:

db.open(function() { 
    // db is now open, let's run some more code 
    execute_db_query(); 
}); 

Básicamente, simplemente debe seguir las pautas establecidas en the documentation.

+1

Bueno, si solo quiero abrir el grupo de conexiones una vez, entonces lo que está haciendo no tendría sentido . Estoy familiarizado con el patrón de devolución de llamada. Mi problema es con la configuración inicial de la aplicación. La aplicación necesita configurarse antes de poder ejecutar cualquier cosa, esto incluye configurar la base de datos, y debe hacerse de forma síncrona. Quizás esto no sea posible, pero ¿hay alguna manera de ceder el flujo de control al ciclo de eventos? –

+1

También no desea abrir y cerrar cada vez que es un desperdicio. Esto es lo que Chris (el tipo que escribió la biblioteca a la que pertenecía) dijo: "El patrón general es abrir la conexión db antes de iniciar el marco web y luego dejarlo abierto". [aquí] (https://github.com/christkv/node-mongodb-native/issues/477) –

+2

Tal vez me esté perdiendo algo, pero ¿por qué no simplemente iniciar el framework web en la devolución de llamada 'db.open'? Si eso no responde, tal vez solo desee pedirle una aclaración directamente. –

4

Me gusta usar el async module cuando tengo bits de código que deben ejecutarse sincrónicamente.

var async = require('async'); 

async.series([ 
    function(next){ 
    db.open(next) 
    } 
, function(next){ 
    db.loadSite('siteName', next) 
    } 
], function(err){ 
    if(err) console.log(err) 
    else { 
    // Waits for defined functions to finish 
    console.log('Database connected') 
    } 
}) 
Cuestiones relacionadas