2012-01-16 16 views
8

Ecco una domanda su cosa penserei sarebbe un semplice schema nel nodo js.Come attendere in Node.js

Ecco il mio esempio in CoffeeScript:

db_is_open = false 

db.open -> 
    db_is_open = true 

wait = -> 
wait() until db_is_open 

E qui di nuovo in javascript:

var db_is_open = false; 

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

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

Questo non funziona affatto, perché il ciclo while non cede il controllo, che credo abbia senso . Tuttavia, come posso dire alla funzione di attesa di provare la prossima callback in coda?

+3

Non si può aspettare, è possibile utilizzare solo le richiamate – Raynos

+2

si sono fondamentalmente chiedendo come scrivere codice node.js asincrono in maniera sincrona, che è un tema caldo con un sacco di nuovi progetti e idee. Controlla questo link, sono comunque tanti: http://stackoverflow.com/questions/5139381/node-js-async-libs – tokland

risposta

2

Perché stai aspettando, e non solo utilizzando una richiamata che viene eseguita all'interno della funzione passata a db.open? Questo è più o meno il codice nodo idiomatica:

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

In sostanza, si dovrebbe semplicemente seguire i modelli disposte in the documentation.

+1

Beh, se voglio solo aprire il pool di connessioni una volta, allora quello che stai facendo non avrebbe senso . Ho familiarità con il modello di callback. Il mio problema riguarda la configurazione iniziale dell'app. L'app deve essere impostata prima di poter eseguire qualsiasi cosa, inclusa la configurazione del database e deve essere eseguita in modo sincrono. Forse non è possibile, ma esiste un modo per restituire il flusso di controllo al ciclo degli eventi? –

+1

Anche tu non vuoi aprire e chiudere ogni volta che è uno spreco. Ecco cosa ha detto Chris (il tizio che ha scritto la libreria a cui ti sei collegato) "Il modello generale è di aprire la connessione db prima di avviare il framework web e poi lasciarlo aperto". [qui] (https://github.com/christkv/node-mongodb-native/issues/477) –

+2

Forse mi manca qualcosa, ma perché non iniziare il framework web nel callback 'db.open'? Se questo non ti risponde, potresti semplicemente chiedergli direttamente un chiarimento. –

4

Mi piace usare lo async module quando ho bit di codice che devono essere eseguiti in modo sincrono.

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') 
    } 
}) 
Problemi correlati