2015-09-15 7 views
8

Il mio script esegue alcune attività asincrone usando promesse (con la libreria q). Esecuzione di test di moka funziona bene. Tuttavia, l'esecuzione dello script dalla riga di comando non lo fa. Il processo del nodo muore immediatamente.Come mantenere vivo uno script node.js durante la risoluzione delle promesse?

var bot = require('./bot'); 

bot.getCategories().then(function (categories) { 
    console.log('Found ' + categories.length + ' categories'); 
}); 
+1

Che cos'è './Bot', che cosa fa? Il tuo script muore anche quando sostituisci 'bot.getCategories()' con 'Q.resolve()'? – Bergi

risposta

4

mio script esegue alcune operazioni asincrone utilizzando promesse (con la libreria q). Esecuzione di test di moka funziona bene. Tuttavia, l'esecuzione dello script dalla riga di comando non lo fa. Il processo del nodo muore immediatamente.

Questo è sicuramente un bug, per favore segnalalo. L'ambiente Node.js non dovrebbe uscire prematuramente mentre ci sono cose ancora accodate nel ciclo degli eventi.

Non dovresti modificare il codice un bit perché ciò avvenga. La libreria Q (tenere presente che oggi ci sono alternative più moderne e native) programma callback asincroni sulla coda "microtask" process.nextTick. Probabilmente la libreria del bot esegue anche l'IO, entrambe queste cose dovrebbero far sì che il nodo non termini.

+0

Preferirei un bug in 'bot.getCategories()', non nel nodo. Forse la promessa non viene mai risolta, quindi Q non pianifica neanche una microtask. – Bergi

+0

@Bergi a meno che 'bot.getCategories' faccia riferimento a un modulo nativo quindi qualsiasi bug che ha è _still_ un bug del nodo poiché il nodo deve essere a conoscenza di tutti gli eventi io in sospeso. Se si tratta di un modulo nativo, potrebbe esserci un bug (tuttavia, molte persone usano pochissimi moduli nativi). Il fatto che questi tipi di bug in Node non siano molto rari aggiunge anche il mio sospetto (essi vengono gestiti velocemente). –

+0

Non lo sono? OK, sospettavo che un errore di libreria fosse più probabile, specialmente se non avessimo visto il codice o non sapessimo cosa fare (e se ci sia effettivamente IO coinvolto). – Bergi

7

Node.js uscirà quando non ci sono più callback da elaborare. È possibile utilizzare setInterval o setTimeout per mantenerne sempre uno in modo che il processo non esca automaticamente.

function wait() { 
    if (!EXITCONDITION) 
     setTimeout(wait, 1000); 
}; 
wait();