In che modo un processo node.js sa quando fermarsi?

Poiché molti script node.js seguono uno schema per fare qualcosa in modo asincrono (esempio sotto), come fanno a sapere quando fermarsi?

Nel seguente codice, come determina il nodo dopo aver elaborato writefile e registrato correttamente il callback, che il processo deve essere mantenuto attivo fino all’esecuzione del callback?

fs = require('fs'); fs.writeFile('foo', 'cat', function() { console.log('wrote to foo!'); fs.readFile('foo', 'utf8', function(err, data) { console.log(data); }); }); 

nodo tiene traccia di tutte le richieste di lavoro in sospeso. La chiamata fs.writefile () crea una richiesta di lavoro per I / O e aggiunge la richiamata a quella richiesta. nodo salva la richiesta di lavoro nelle sue tabelle contemporaneamente all’avvio dell’attività di I / O. L’esecuzione del codice termina quando raggiungi la fine della tua funzione. (Ma la tua memoria / variabili / ecc. Rimangono)

Successivamente, l’I / O termina e il nodo estrae la richiesta di lavoro dalle sue tabelle. Vede il callback allegato alla richiesta e quindi chiama quella funzione con i risultati della richiesta I / O. I tuoi dati globali sono ancora in circolazione e tutte le variabili nelle chiusure esistono ancora, quindi sembra che il tuo codice non si sia mai fermato.

Se non fai nulla di più, non fare più richieste, quindi quando ritorni dalle tue funzioni il nodo si fermerà, perché quindi non ci saranno richieste rimanenti nelle code.

Quindi il nodo ‘sa’ di continuare a funzionare perché tiene traccia delle richieste di lavoro attive nelle sue tabelle e non si fermerà fino a quando tutto il lavoro in coda non sarà terminato e quelle tabelle saranno vuote.

Si noti che il “lavoro in coda” può includere aspetti come l’attesa di timer o l’attesa di dati di rete. Fai una richiesta che dice “chiamami qui quando / se succede qualcosa dopo”.

setTimeout () è anche una richiesta di lavoro (se si strizza un po ‘). Con un timer sai che succederà qualcosa e quando accadrà. Con setTimeout () succederà solo un “qualcosa”. il nodo effettuerà una sola chiamata alla richiamata e quindi “dimenticherà” la richiesta di lavoro. Se invece utilizzi setInterval () hai creato una richiesta di lavoro persistente. il nodo “manterrà” la richiesta di lavoro nelle sue tabelle e chiamerà ripetutamente la richiamata, finché non si annulla la richiesta.

net.Server.listen () è un’altra richiesta di lavoro che è una richiesta di lavoro persistente. Non sai quando verrà richiamato il tuo callback o quante volte, poiché ciò dipende dai client remoti che si connettono al tuo server. node mantiene triggers la richiesta di lavoro nelle sue tabelle finché non si annulla la richiesta.