My First Async I/O! nos introduce a la entrada/salida asíncrona.

Leccion-4 learnyounode Lección 4 – Mi Primer Async I/O!

El framework node.js está construido con la idea de usar operaciones asíncronas en lugar de operaciones síncronas como vimos en la lección 3. De hecho, el nodo se describe como un tiempo de ejecución JavaScript asíncrono controlado por eventos en nodejs.org, el sitio oficial de node.js.

Las lecciones anteriores no fueron particularmente difíciles. Sin embargo, la programación asíncrona es un reto.

Leccion-4 learnyounode Lección 4 – Mi Primer Async I/O!

Esta es probablemente la lección más importante en el nodo learnyou. Todo lo que se mueve hacia adelante se basa en esta lección. La comprensión del procesamiento asincrónico es crítica para la programación con el nodo.

Leccion-4 learnyounode Lección 4 – Mi Primer Async I/O!

La sugerencia de la lección sugiere leer sobre la devolución de llamadas en el artículo de Art of Node de Max Ogden sobre Git. Sin embargo, recomiendo que te tomes el tiempo para leer lo de «quién». De hecho, la solución que proporciono para esta lección se basa en el ejemplo de getNumber de Ogden.

Las rellamadas son parte del lenguaje JavaScript. Una llamada de retorno es un tipo de función que se ejecuta posteriormente. Imagina que eres un contratista construyendo una casa. Usted necesita tener los gabinetes instalados, las paredes pintadas y las molduras instaladas a lo largo de las paredes.

Las paredes serán blancas, y los gabinetes y los adornos serán de roble. Usted encuentra un pintor, un instalador de gabinetes y un finalizador para hacer el trabajo, pero obviamente no puede permitir que los tres hagan su trabajo al mismo tiempo. Además, el orden en que se completan las tareas es importante.

Si los gabinetes y las molduras se instalan primero, el pintor podría accidentalmente obtener pintura blanca en la madera de roble. Por otro lado, si el instalador y el instalador del gabinete intentan hacer su trabajo justo después de que el pintor se va, pueden arruinar la pintura.

Usted, como contratista, le dice al pintor que llame al instalador del gabinete y al encargado del acabado una vez que haya terminado y la pintura se haya secado.

Leccion-4 learnyounode Lección 4 – Mi Primer Async I/O!

Eso es una devolución de llamada. Una función le dice a otra función que llamará a la otra función una vez que haga su trabajo.

Una alternativa a la devolución de llamadas son las promesas. Las promesas están fuera del alcance de este ejemplo.

Sin embargo, si quieres saber más sobre ellos, echa un vistazo a What Pinky and the Brain can teach us about Promises and Currys (Lo que Pinky y el Cerebro pueden enseñarnos sobre Promesas y Currys).

Para imprimir el número de líneas en nuestro archivo, necesitamos usar el método console.log() dentro de una función de devolución de llamada.

Si lo colocamos fuera de una función de devolución de llamada, los métodos console.log() y fs.readFile() se ejecutarán al mismo tiempo.

Sin embargo, console.log() se completará significativamente más rápido porque no necesita hablar con el disco duro.

Como resultado, console.log() imprimirá ‘undefined’ en la consola en lugar del número de líneas del archivo.

Solución oficial

var fs = require(‘fs’)  
var file = process.argv[2]  
  
fs.readFile(file, function (err, contents) {  
  // fs.readFile(file, ‘utf8’, callback) can also be used  
  var lines = contents.toString().split(‘\n’).length – 1  
  console.log(lines)  
})

Como puede ver en la solución oficial anterior, console.log se coloca dentro de una función de devolución de llamada. Vamos a romper la estructura de la solución oficial. Puede ver que ‘fs’ es necesario al igual que el ejercicio anterior.

El tercer índice de la propiedad argv del objeto de proceso se pasa a una variable llamada fichero. El método fs.readFile() recibe dos argumentos, file, y una función callback() {}.

La función de devolución de llamada también tiene dos argumentos, error y contenido. Dentro de la función callback, el contenido se pasa a las líneas variables y se convierte en una cadena con el método toString(). Luego la cadena se divide en cada nueva línea con el método split().

A continuación, obtenemos la longitud del método de partición menos uno. Finalmente, console.log() imprime el contenido de las líneas a la consola. Observe cómo se encapsula la llamada de retorno en el método fs.readFile().

method(callback(){})

La solución oficial muestra uno de los métodos más comunes que he observado en la nodósfera para emplear las llamadas de retorno. Si desea hacer más de una cosa con los resultados de su función, puede seguir añadiendo funciones dentro de su función.

Sin embargo, usted podría fácilmente encontrarse en un lugar conocido como el infierno de la devolución de llamada. Un conjunto de funciones profundamente anidadas que son difíciles de leer y entender.

Imagínate callbacks anidados con callbacks, anidados dentro de callbacks hasta el punto en que el código comienza a parecerse a una imagen ascii de las montañas rocosas.

Mirar http://callbackhell.com/

Para evitarlo, puede dividir sus funciones en varias funciones.

Otra solución

var fs = require(‘fs’)
var lines = undefined
 
function getLines(callback) {
  fs.readFile(process.argv[2], ‘utf8’, function doneReading(err, fileContents) {
    lines = fileContents.split(‘\n’).length – 1
    callback()
  })
}
 
function logLines() {
  console.log(lines)
}
 
function magicNumber() {
  var number = +process.argv[3]
  if (lines >= number){
    console.log(‘This file has ‘+number+ ‘ or more lines’)
  } else {
    console.log(‘This file does not have ‘+number+’ or more lines’)
  }
}
 
getLines(logLines)
getLines(magicNumber)

En esta solución, obtengo el número de líneas en mi archivo con la función getLines(). La función getLines() puede recibir una devolución de llamada como argumento.

Abajo, estoy declarando dos funciones más llamadas logLines() y magicNumber(). La función logLines() imprime el número de líneas de mi archivo a la consola, y la función magicNumber() me permite pasar un número mágico como cuarto argumento en la línea de comandos.

Si mi archivo tiene tantas líneas o más que mi número mágico, me dice que tiene más líneas o más. Si no, la función dice que mi archivo no tiene tantas o más líneas.

Debajo de mis funciones declaradas, paso logLines() y magicNumber() a la función getLines().

Cuando getLines() termina de leer un archivo, llama a ambas funciones para que puedan hacer su trabajo con el resultado de getLines().

Reader Interactions

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Share This