nodejs node example event emitter emails custom javascript node.js javascript-events

javascript - emitter - node js events example



No se puede entender node.js (4)

De alguien con poca experiencia en JS, ¿qué recomienda para aprender Node.js?

Leí mucho en el foro sobre eventos dirigidos, no bloqueados, asíncronos, devoluciones de llamadas, etc. ¡Pero no sé qué es eso!

¿Dónde puedo aprender lo básico para entender todos esos términos y en el futuro, node.js?

¡Gracias!



Los conceptos básicos que necesita comprender para avanzar con Node.js son la idea de eventos, emisores de eventos y escuchas de eventos.

En Nodo, la mayoría de las funciones a las que puede llamar son no bloqueantes. Cuando llama a fs.ReadStream (), por ejemplo, devuelve un objeto ReadableStream. Ese objeto es un EventEmitter, por lo que para hacer algo con el contenido de la transmisión, debe adjuntar un oyente al objeto, que es una función a la que se llama cuando ocurre un evento en particular.

Así que algo como esto funciona:

var fs=require(''fs''); var stream = fs.createReadStream("/var/log/messages", { ''flags'':''r'' }); stream.addListener(''data'', function(someData) { console.log(someData); });

Esto lee todo el texto del archivo dado y lo escribe en la consola. Cuando hay datos para leer del flujo, se llama a su función y se pasan los datos del archivo.

Curiosamente, una vez que no hay más datos para leer del archivo, el script sale. El nodo solo permanece en ejecución siempre que haya un detector de eventos válido conectado a un emisor u otra devolución de llamada asíncrona (como un temporizador) que esté activa.


Los conceptos que menciona (controlados por eventos, no bloqueantes, asíncronos, devoluciones de llamada) no son específicos de JavaScript y su comprensión en un contexto más general es valioso. Todos giran en torno a manejar con gracia recursos sobre los cuales no tenemos control.

Imagine esperar por los datos de una conexión TCP, esperar a que el sistema operativo elimine un archivo o esperar a que un usuario haga clic en un botón. Si programó esto paso a paso (paso a paso es sincrónico ), navegará a lo largo de "hacer el paso 1", "hacer el paso 2", "hacer el paso 3" - hasta que llegue a la paso "esperar a que algo suceda". En ese momento, su programa se detendría y se negaría a ceder hasta que recibiera los datos, recibiera la confirmación de eliminación o recibiera el clic del botón. En otras palabras, la llamada impide que el programa continúe. Esto es bastante ineficiente considerando que es probable que haya otras conexiones TCP, operaciones de archivos y acciones de IU que requieren nuestra atención y no dependen del elemento que estamos esperando.

En muchos casos, sería mejor indicar que estamos interesados ​​en un recurso y recibir notificaciones fuera de las instrucciones paso a paso cuando el recurso cambia. De su lista de conceptos:

  • Events son cambios en los recursos que nos interesan: nuestra conexión TCP recibió algunos datos, se completó la eliminación del archivo o un usuario hizo clic en un botón.
  • Asynchronous llamadas Asynchronous dicen al sistema operativo o al tiempo de ejecución que estamos interesados ​​en hacer algo con un recurso. No son de bloqueo : nuestro programa puede funcionar en otra cosa mientras espera un cambio en el recurso.
  • Callbacks son funciones que se ejecutan cuando cambia el recurso. Una llamada de recursos asíncrona a menudo acepta una o más referencias a las funciones de devolución de llamada (una para el éxito, una para un error, etc.). Cuando el recurso cambia, el tiempo de ejecución llama a la devolución de llamada apropiada.

Podemos ver estos conceptos ilustrados cambiando el nombre de un archivo con node.js:

var fs = require(''fs''); // args (current file name, new file name, callback function) fs.rename(''/tmp/hello'', ''/tmp/world'', function (err) { // this occurs when the rename is complete if (err) throw err; console.log(''rename complete''); }); console.log(''step after rename'');

El tercer argumento puede parecer extraño. Es una función sin nombre ( anonymous ) que se llamará cuando se complete el cambio de nombre.

Tenga en cuenta que dado que fs.rename es asíncrono, es imposible saber si primero veremos el mensaje ''rename complete'' o ''step after rename''. Esa es la desventaja de la programación dirigida por eventos / asíncrona: si tenemos un conjunto complejo de tareas interdependientes, debemos ser extremadamente cuidadosos para asegurar que las tareas dependientes se completen antes que las tareas que dependen de ellas. El hecho de que el orden de finalización de una llamada asíncrona puede cambiar puede llevar a errores muy sutiles.

Ver también:

Editar por solicitud de donald:

La mejor manera de entender node.js es descargarlo, compilarlo, instalarlo y usarlo. Necesitarás:

  • Mac OS o Linux. Si se siente cómodo con Cygwin, eso también puede ser una opción, pero si está ejecutando Windows, me resulta más fácil ejecutar Linux en una máquina virtual.
  • Git : no es necesario, pero facilita la búsqueda del repositorio de código.
  • Una forma de depurar tu aplicación. Vea esta pregunta . Inicialmente, escribir información de depuración en la consola puede funcionar. Eventualmente, querrás una depuración robusta.
  • Una idea: ¿qué es lo que quieres hacer con node.js? Si está interesado en una descripción general de sus capacidades, navegue por su API .

La mayoría de los tutoriales se centran en la capacidad de node.js para construir rápidamente un servidor Http:

Tenga en cuenta que node.js llena un nicho muy particular: está diseñado para construir programas de red. Puede que no sea la herramienta adecuada para otros tipos de programas.


«Javascript: The Good Parts» es uno de los mejores libros de todos los tiempos para aprender los entresijos del lenguaje y no solo el contenido de DOM.