1. El papel de node.js,
El significado de E/S, (E/S es la abreviatura de la entrada/salida, como: el texto del tipo de teclado, la entrada y el texto se muestra en la pantalla. El mouse se mueve, el mouse se mueve, el mouse se mueve en la pantalla, la entrada terminal y la salida vista.
El problema que Node.js quiere resolver, (entrada de proceso, alta concurrencia. Por ejemplo, puede haber millones de jugadores en los juegos en línea, y millones de entradas, etc.) (Node.js es adecuado para la categoría: Node.js es más adecuado cuando una aplicación necesita enviar y recibir datos en la red. Este puede ser un dispositivo de tercera parte de API, o una comunicación en tiempo real entre un browser y un servidor).
El significado de la concurrencia, (el término concurrencia describe que las cosas sucederán al mismo tiempo y pueden interactuar entre sí. El modelo de E/S eventual del nodo nos permite evitar los problemas comunes de entrelazamiento y concurrencia en E/S asíncronas multiproceso)
E/S de red de demostración
Código JS
var http = require ('http'), urls = ['www.baidu.com', 'www.10jqka.com.cn', 'www.duokan.com']; function fetchPage (url) {var start = new Date (); http.get ({host: url}, function (res) {console.log ("obtuvo respuesta de:" + url); console.log ("solicitud tomada:", nueva fecha () - inicio, "ms");}); } para (var i = 0; i <urls.length; i ++) {fetchPage (urls [i]); }Nombrado node.js
Ejecutamos Node Node.js en el terminal
Producción:
Requerimos Node.js para acceder a tres URL e informar la respuesta recibida y el tiempo que tomó.
Podemos ver que el tiempo de salida es diferente para las dos veces. Afectado por varios factores, el tiempo para resolver solicitudes de DNS, programas de servidor ocupado, etc.
¿Por qué JavaScript es un idioma impulsado por el evento?
JavaScript gira en torno a la arquitectura del evento que originalmente se asoció con el modelo de objeto de documento (DOM). Los desarrolladores pueden hacer cosas cuando ocurren eventos. Estos eventos incluyen a los usuarios que hacen clic en un elemento, la página completa la carga, etc. Usando eventos, los desarrolladores pueden escribir oyentes para eventos que se activen cuando ocurren eventos.
2. Devolución de llamada
1. ¿Qué es una devolución de llamada?
2. Analice la devolución de llamada
Una devolución de llamada se refiere a pasar una función como argumento a otra función y generalmente se llama después de que se completa la primera función.
Ejemplo: por ejemplo, el método Hide () en jQuery,
Código JS
1, $ ("P"). Ocultar ('lento'); 2, $ ("P"). Hide ('Slow', function () {Alert ("El párrafo ahora está oculto")});Las devoluciones de llamada son opcionales.
1 No se necesita devolución de llamada
2. Hay una devolución de llamada. Cuando el párrafo está oculto, se llamará, mostrando un mensaje de alerta.
Para ver la diferencia entre el código con y sin devoluciones de llamada
Código JS
$ ("P"). Hide ('lento'); alerta ("El párrafo ahora está oculto"); // 1 $ ("P"). Hide ('Slow', function () {Alert ("El párrafo ahora está oculto")}); // 21. No hay devolución de llamada, y la orden de ejecución es la misma. Sin embargo, podemos ver que el párrafo P no ha estado completamente oculto, sale alerta.
2. Hay una devolución de llamada, y la ejecución se realiza después de que se completa la piel.
Analizar devoluciones de llamada
Código JS
función havbreakfast (comida, bebida, devolución de llamada) {console.log ('tener barrakfast de' + alimentos + ',' + bebida); if (callback && tipof (llamado) === "función") {callback (); }} HaveBreakFast ('Foast', 'Coffee', Function () {Console.log ('Desayuno terminado. ¡Tiempo para ir a trabajar!');});Producción:
Tener una barra de espuma, Desayuno Coffinido. ¡Es hora de ir a trabajar!
Aquí hay una función creada con tres parámetros, el tercer parámetro es la devolución de llamada, que debe ser una función.
La función Havbreakfast registra lo que come en la consola y luego llama a la función de devolución de llamada pasada como un parámetro.
Cómo usar devoluciones de llamada para Node.js
Ejemplo de usar el módulo del sistema de archivos para leer el contenido del archivo desde el disco en node.js
Código JS
var fs = require ('fs'); fs.ReadFile ('SomeFile.txt', 'utf8', function (err, data) {if (err) throw err; console.log (data);});El resultado es: el contenido en SomeFile.txt.
1. Se solicita el módulo FS (sistema de archivos) para su uso en el script
2. La ruta de archivo en el sistema de archivos se proporciona como el primer parámetro para el método Fs.ReadFile.
3. El segundo parámetro es UTF8, que indica la codificación del archivo
4. Proporcione la función de devolución de llamada como el tercer parámetro al método Fs.ReadFile
5. El primer parámetro de la función de devolución de llamada es ERR, que se usa para guardar el error devuelto al leer el archivo.
6. El segundo parámetro de la función de devolución de llamada es presionarla, y el usuario guarda los datos devueltos por el archivo de lectura.
7. Una vez que se lee el archivo, se llamará a la devolución de llamada.
8. Si ERR es verdadero, se lanzará un error.
9. Si ERR es falso, entonces los datos del archivo se pueden usar.
10. En este caso, los datos se registrarán en la consola.
Otro es el módulo HTTP, el módulo HTTP permite a los desarrolladores crear clientes y servidores HTTP.
Código JS
var http = require ('http'); http.get ({host: 'shapeshed.com'}, function (res) {console.log ("Got Response:" + res.statuscode);}). on ('error', function (e) {console.log ("got error:" + e.message);});Resultado: recibió respuesta: 200
1. Solicite el módulo HTTP para su uso en el script
2. Proporcione dos parámetros al método http.get ()
3. El primer parámetro es el objeto de opción. En este ejemplo, debe obtener la página de inicio de Shapeshed.com
4. El segundo parámetro es una función de devolución de llamada con la respuesta como parámetro
5. Cuando el servidor remoto devuelve la función correspondiente, la función de devolución de llamada se activará.
6. Registre el código de estado de respuesta en la función de devolución de llamada. Si hay algún error, puede grabarlo.
A continuación, veamos que están sucediendo 4 operaciones diferentes de E/S, todas usan devoluciones de llamada
Código JS
var fs = require ('fs'), http = require ('http'); http.get ({host: 'www.baidu.com'}, function (res) {console.log ("baidu.com");}). on ('error', function (e) {console.log ("obtuvo error:" + e.message);}); fs.ReadFile ('SomeFile.txt', 'utf8', function (err, data) {if (err) throw err; console.log ("somefile");}); http.get ({host: 'www.duokan.com'}, function (res) {console.log ("duokan.com");}). on ('error', function (e) {console.log ("obtiene error:" + e.message);}); fs.ReadFile ('SomeFile2.txt', 'utf8', function (err, data) {if (err) throw err; console.log ("someFile2");});¿Podemos saber qué operación regresa primero?
La suposición es que los dos archivos leídos del disco se devuelven primero, porque no hay necesidad de ingresar a la red, pero es difícil para nosotros decir qué archivo volverá primero, porque no conocemos el tamaño del archivo. Para la adquisición de dos páginas de inicio, el script debe ingresar a la red, y el tiempo de respuesta depende de muchas cosas impredecibles. El proceso Node.js no saldrá hasta que haya una devolución de llamada registrada que no se haya activado. Las devoluciones de llamada primero resuelven imprevisibilidad, y también es una forma eficiente de lidiar con la concurrencia (o hacer más de una cosa a la vez).
Aquí están los resultados de mi ejecución
Código sincrónico y asincrónico
Primero mire el código, sincronice (o bloquee) el código
Código JS
function sleep (MilliseConds) {var start = new Date (). GetTime (); while ((new Date (). Sleep (2000); console.log ('datos devueltos desde la página solicitando'); } function fetchapi () {console.log ('buscar api'); Sleep (2000); console.log ('Datos devueltos de la API'); } fetchPage (); fetchapi ();Cuando el script se está ejecutando, se llamará a la función fetchpage (). Hasta que regresa, la ejecución del script está bloqueada. Antes de que regrese la función FetchPage (), el programa no se puede mover a la función Fetchapi (). Esto se llama operación de bloqueo.
Node.js casi nunca usa este estilo de codificación, pero llama a las devoluciones de llamada asincrónicamente.
Mira el siguiente código,
Código JS
var http = require ('http'); function fetchPage () {console.log ('Page de búsqueda'); http.get ({host: 'www.baidu.com', ruta: '/? } function fetchapi () {console.log ('buscar api'); http.get ({host: 'www.baidu.com', ruta: '/? } fetchPage (); fetchapi ();Cuando se permite este código, ya no espera a que la función FetchPage () regrese, y la función Fetchapi () se llamará de inmediato. El código se bloquea usando devoluciones de llamada. Una vez llamado, ambas funciones escuchan la retorno del servidor remoto y activan la función de devolución de llamada.
Tenga en cuenta que el orden de retorno de estas funciones no puede garantizarse, pero está relacionado con la red.
Bucle de eventos
Node.js utiliza el bucle de eventos de JavaScript para admitir el estilo de programación asíncrono que defiende. Básicamente, el bucle de eventos permite que el sistema guarde la función de devolución de llamada primero y luego se ejecute cuando el evento ocurre en el futuro. Estos pueden ser datos de retorno de la base de datos o datos de retorno de solicitud HTTP. Debido a que la ejecución de la función de devolución de llamada se pospone hasta que el evento se invierte, no es necesario detener la ejecución y el flujo de control puede volver al entorno de tiempo de ejecución del nodo, permitiendo que otras cosas sucedan.
Node.js a menudo se considera un marco de programación de red porque está diseñado para manejar la incertidumbre en los flujos de datos en la red. Lo que contribuye a tales diseños son bucles de eventos y el uso de devoluciones de llamada, y son como programadores que pueden escribir código asíncrono que responde a los eventos de red o de E/S.
Las reglas a seguir son: la función debe volver rápidamente, la función no debe bloquearse y las operaciones de larga duración deben moverse a otro proceso.
Lo que no es adecuado para nodo.js incluye procesar grandes cantidades de datos o cálculos en ejecución durante mucho tiempo. Node.js está diseñado para impulsar los datos en la red y completarlos al instante.