2010-09-14 27 views
18

De alguien con poca experiencia en JS, ¿qué recomiendan para aprender Node.js?No puedo entender node.js

He leído mucho en el foro sobre eventos controlados, no bloqueantes, asincrónicos, devoluciones de llamada, etc. ¡pero no sé qué es eso!

¿Dónde puedo aprender los conceptos básicos para comprender todos los términos y en el futuro, node.js?

Gracias!

+4

Comience escribiendo muchos programas de Javascript y cuidándoselo bien. No tiene sentido siquiera considerar NodeJS si no entiendes javascript y las técnicas correspondientes. No quiero ser duro, pero eso es lo que necesitas aprender; JavaScript y cómo se usa y usa correctamente, esos son los conceptos básicos. Ergo, primero javascript maestro;) muchos awnsers sobre eso en stackoverflow. – BGerrissen

+0

Gracias por su comentario. Me resulta difícil aprender JS porque no sé qué hacer con eso. Si quiero aprender Django, Rails, etc. sé qué hacer, no JavaScript. Además, ¿me pueden recomendar un buen libro que pueda establecer los conceptos básicos del conocimiento de node.js también? gracias – donald

+1

Acabo de echar un vistazo a node.js. Simplemente usa la sintaxis de JS como jQuery is. ¿Siente que un conocimiento profundo de JavaScript sería mucho más útil al usar node.js? De todos modos, el libro para leer es JavaScript: La Guía definitiva – mplungjan

Respuesta

49

Los conceptos que menciona (controlados por eventos, no bloqueantes, asincrónicos, devoluciones de llamada) no son específicos de JavaScript y es valioso comprenderlos en un contexto más general. Todos giran en torno al manejo elegante de recursos sobre los cuales no tenemos control.

Imagínese la espera de datos de una conexión TCP, a la espera de que el sistema operativo elimine un archivo o de que el usuario haga clic en un botón. Si programó esto paso a paso (paso a paso es síncrono), navegaría por la ruta - "haga el paso 1", "haga el paso 2", "haga el paso 3" - hasta que dale al paso "espera a que pase algo". En ese punto, su programa se detendría y se rehusaría a moverse hasta que recibiera los datos, recibió la confirmación de eliminación o recibió el clic del botón. En otras palabras, la llamada bloquea el programa del procedimiento. Esto es bastante ineficiente considerando que probablemente haya otras conexiones TCP, operaciones de archivos y acciones de UI que necesiten nuestra atención y no dependan 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 cambie. De su lista de conceptos:

  • Events son los cambios en los recursos que nos interesan - nuestra conexión TCP recibieron algunos datos, la eliminación de archivos se ha completado, o un usuario hace clic en un botón.
  • Asynchronous llamadas le dicen al sistema operativo o tiempo de ejecución que estamos interesados ​​en hacer algo con un recurso. Son sin bloqueo - nuestro programa puede funcionar en otra cosa mientras espera un cambio en el recurso.
  • Callbacks son funciones que se ejecutarán cuando el recurso cambie. Una llamada de recurso asíncrono a menudo acepta una o más referencias a 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 por cambio de 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) a la que se llamará cuando se complete el cambio de nombre.

Tenga en cuenta que desde fs.el cambio de nombre es asincrónico, es imposible saber si veremos primero el mensaje "renombrar completo" o "paso después de cambiar el nombre". Esa es la desventaja de la programación asincrónica y basada en eventos: si tenemos un conjunto complejo de tareas interdependientes, debemos ser extremadamente cuidadosos para asegurar que las tareas dependientes se completen antes de las tareas que dependen de ellas. El hecho de que el orden de finalización de la llamada asíncrona puede cambiar puede conducir a errores muy sutiles.

Consulte también:


Editar por la petición de Donald:

La mejor manera de entender node.js es descargar, compilar, insta ll, y usarlo. Necesitará:

  • Mac OS o Linux. Si está cómodo con Cygwin, 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 hace que recuperar el depósito de código sea fácil.
  • Una forma de depurar su aplicación. Ver this question. 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, busque its 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 ocupa un nicho muy particular - i Está diseñado para construir programas de red. Puede que no sea la herramienta adecuada para otros tipos de programas.

+1

Corbin, gracias por tu explicación ¿También puede agregar algunas otras referencias que me pueden ayudar a comprender node.js? Algo que crees pertinente. Gracias – donald

+0

Manera de poner esfuerzo en su respuesta [votaciones] –

+0

Gran respuesta Corbin! –

6

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

En el nodo, la mayoría de las funciones 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 cualquier cosa con los contenidos de la secuencia, debe adjuntar un oyente al objeto, que es una función que se llama cuando se produce 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 fichero dado, y lo escribe en la consola. Cuando hay datos para leer de la transmisión, se llama a su función y se pasan los datos del archivo.

Curiosamente, una vez que ya no hay más datos para leer del archivo, la secuencia de comandos se cierra. El nodo solo permanece en ejecución mientras haya un escucha de eventos válida conectada a un emisor, u otra devolución de llamada asincrónica (como un temporizador) esté activa.

+1

Gracias. Lo que no entiendo de ese ejemplo es dónde llamó la función (someData) y qué es "someData". No veo nada que pase información al argumento someData. gracias – donald

+0

El objeto de transmisión comienza a emitir esos eventos, llamando a la función (someData) detrás de las escenas. – Unoti

+0

Derecha. Cada emisor de eventos tiene una lista de oyentes de eventos para cada evento que puede disparar. Cuando se activa un evento, se llama a cada uno de los oyentes. –

Cuestiones relacionadas