2012-09-16 24 views
5

Estoy leyendo este artículo: http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/ y tengo algunos problemas para entender las transmisiones.streams nodejs vs callbacks

Cita:

"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." 

Así que el ejemplo de código es el siguiente:

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

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

¿Por qué deberíamos usar esa manera anterior cuando simplemente podríamos hacer:

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

¿Cuándo o por qué usaría transmisiones?

Respuesta

13

Utilizará la secuencia al trabajar con archivos de gran tamaño. Con una devolución de llamada, todos los contenidos del archivo deben cargarse en la memoria de una vez, mientras que con una transmisión, solo una porción del archivo está en la memoria en un momento dado.

Además, la interfaz de transmisión es posiblemente más elegante. En lugar de fijar explícitamente data, drain y end devoluciones de llamada, en su lugar puede utilizar pipe:

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

Una razón importante es que se puede empezar haciendo un trabajo sobre los datos antes de que todo está en la memoria. Piense en "transmisión de video", donde puede comenzar a ver un clip mientras se está cargando. En muchos casos de uso, una transmisión le permitirá comenzar a procesar datos desde un archivo antes de haber cargado todo.

El otro caso de uso común es cuando solo quiere leer un objeto hasta que detecta alguna condición en los datos. Supongamos que necesita verificar si un archivo grande contiene la palabra "conejo". Si usa un patrón de devolución de llamada, necesitará leer todo el archivo en la memoria, luego examinar el archivo y verificar si la palabra está adentro o no. Con una secuencia, puede detectar la palabra en la línea 5 del archivo, luego puede cerrar la secuencia, sin cargar todo.

Obviamente, hay muchos casos de uso más complejos, y todavía hay un montón de veces en que una devolución de llamada todavía tiene más sentido para la simplicidad (como si necesitara contar el total de veces que apareció "conejo", en cuyo caso para cargar todo el archivo de todos modos).