2012-09-16 11 views
5

Sto leggendo questo articolo: http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/ e ho alcuni problemi di comprensione dei flussi.nodejs streams vs callbacks

Citazione:

"Suppose we want to develop a simple web application 
that reads a particular file from disk and send it to the browser. 
The following code shows a very simple and naïve implementation 
in order to make this happen." 

Così il codice di esempio è la seguente:

var readStream = fileSystem.createReadStream(filePath); 
readStream.on('data', function(data) { 
    response.write(data); 
}); 

readStream.on('end', function() { 
    response.end();   
}); 

Perché dovremmo usare in questo modo al di sopra quando avremmo potuto semplicemente fare:

fs.readFile(filePath, function(err, data){ 
    response.write(data); 
    response.end(); 
}); 

Quando o perché dovrei usare i flussi?

risposta

13

Si utilizza lo streaming quando si lavora con file di grandi dimensioni. Con un callback, tutti i contenuti del file devono essere caricati in memoria in una volta, mentre con uno stream, solo una parte del file è in memoria in un dato momento.

Inoltre, l'interfaccia del flusso è discutibilmente più elegante. Invece di attaccare in modo esplicito data, drain, e end callback, è possibile utilizzare invece pipe:

var readStream = fileSystem.createReadStream(filePath); 
readStream.pipe(response); 
5

Un grande motivo è che si può iniziare a fare il lavoro sui dati prima che sia tutto in memoria. Pensa allo "streaming video", dove puoi iniziare a guardare una clip mentre è ancora in fase di caricamento. In molti casi d'uso, uno stream ti consentirà di iniziare l'elaborazione dei dati da un file prima di aver caricato l'intero oggetto.

L'altro caso di uso comune è quando si desidera solo leggere un oggetto fino a quando non si rileva una condizione nei dati. Di 'che dovevi controllare per vedere se un file di grandi dimensioni conteneva la parola "coniglio". Se si utilizza un pattern di callback, sarà necessario leggere l'intero file in memoria, quindi esaminare il file e verificare se la parola è interna o meno. Con uno stream, è possibile rilevare la parola sulla riga 5 del file, quindi è possibile chiudere lo stream, senza caricare l'intera operazione. Ci sono ovviamente molti casi d'uso più complessi, e ci sono ancora molte volte in cui un callback ha ancora più senso per semplicità (come se fosse necessario contare il numero totale di volte in cui "coniglio" è apparso, nel qual caso hai per caricare comunque l'intero file).

Problemi correlati