Prefacio
En mi imagen, Asynchronous apareció por primera vez con Ajax. Todavía estaba trabajando en .NET en ese momento, y luego .NET en realidad lanzó un control asíncrono ...
Aunque finalmente supe que no era asíncrono ... entonces, el front-end asíncrono se usa mucho. Si no es un programa asincrónico, te da vergüenza decir que los nodejs que escribiste fue hecho por Opportunity JavaScript.
La característica del modelo de programación asincrónica también se ha presentado. Asíncrono tiene muchas ventajas, pero es una pesadilla para el diseño. Asíncrono puede interrumpir el momento, por lo que aumenta las dificultades de diseño.
Sin embargo, Asíncrono ha revolucionado la mejora del rendimiento y la experiencia del usuario, por lo que las características asíncronas de NodeJ son bastante obvias. Hoy lo aprenderemos simplemente
E/S asincrónica
De hecho, a nivel del sistema operativo, solo hay dos métodos de E/S, bloqueados y no bloqueados
En el modelo de bloqueo, la aplicación debe esperar a que la E/S se complete antes de devolver el resultado. Su característica es que el mediocampista trasero está llamado a esperar a que el sistema complete todas las operaciones. Esto hará que la CPU espere, en lugar de regresar inmediatamente después de la llamada de bloqueo.
Estaba leyendo un libro cuando era principiante, pero sentí que no se describía claramente aquí. Además, el modelo asincrónico es en realidad muy grande, solo una mejora en el nivel de sentimiento. Déjame darte un ejemplo simple
Ahora tengo una vista de aplicación de una sola página de dos aplicaciones de una sola página. Cuando busco, necesito buscar en varios canales. Shenzhen necesita llamar a un tercero, y el tercero obtiene datos de canales específicos.
Por supuesto, es muy lento en este momento. Si corté directamente de A a B y B para cargar datos, no habrá ningún problema, pero ahora el problema es que necesito efectos de animación al cambiar de A a B.
Esto requiere que la representación de BVIEW haya terminado durante el proceso de conmutación, y al menos no se enviará al proceso para obtener los datos y comenzar a representar. Por lo tanto, el asíncrono puede no ser tan fácil de usar. Incluso si los datos se solicitan de manera asincrónica, los datos deben obtenerse antes de que se pueda cargar la página.
Esto todavía está bloqueado de carga, no hay forma de hacerlo en los negocios.
Ninguna tecnología es perfecta, el bloqueo hace que la CPU se espera que se desperdicie, la lógica sin bloqueo, también puede requerir la encuesta para confirmar si la carga se completa (solía usar encuestas para detectar si se generó un DOM)
NodeJs adopta un mecanismo de bucle de eventos. Cuando se inicia el proceso, el nodo creará un bucle muerto. Cada proceso de ejecutar el cuerpo del bucle es un tic. El proceso de cada tic es ver si hay eventos que necesitan ser procesados.
Si lo hay, elimine el evento relacionado, ejecútelo y luego ingrese la siguiente lógica. Si no hay, salga del bucle
Durante cada proceso de tick, hay uno o más observadores en cada bucle de eventos. El proceso de juzgar si hay un evento que se debe procesar es preguntar a estos observadores si el evento debe procesarse.
Tome nuestro modelo de evento HTML como ejemplo
Para HTML, de hecho, cada uno de sus DOM es un observador. El DOM de la página observa los cambios de nuestra página web. Después de proporcionar un addEventListener a un DOM, registraremos una función de devolución de llamada. Los eventos que registramos se colocarán en un objeto "contenedor". En este momento, es solo un registro. Estas funciones se activarán después de cumplir con las condiciones (cuando cambie la página), y los eventos relacionados se sacarán del contenedor para su ejecución.
Ahora hacemos clic en un punto en la página una vez, y luego eliminaremos la colección de eventos de clic del contenedor. Encontraremos los DOM relevantes y luego activaremos las funciones de devolución de llamada de estos DOM.
Los eventos pueden provenir de clics del usuario o cambios de datos. En el nodo, los eventos provienen principalmente de solicitudes de red y E/S de archivos. Estos eventos tendrán observadores correspondientes, como observadores de archivos y observadores de redes.
Este es también un modelo de producción/consumo típico, E/S asíncrono, solicitudes de red para proporcionar producción de eventos, los eventos se pasan a varios observadores, eventos de registro de observadores y bucles de eventos son responsables de eliminar eventos y luego ejecutar eventos
PD: Tome clic como ejemplo. Cada observador DOM primero registra el evento, el proceso de la página monitorea constantemente la página, el usuario hace clic en el evento de producción de la página y luego el evento de clic registrado se saca del contenedor y se ejecuta.
La lógica de la función general es controlada por nosotros:
La copia del código es la siguiente:
var foreach = function (lista, devolución de llamada) {
para (var i = 0, len = list.length; i <len; i ++) {
devolución de llamada (lista [i], i, lista);
}
}
En el caso de Asíncrono, la función de devolución de llamada ya no está controlada por el desarrollador. Cada vez que se inicia una llamada JS, se generará un objeto de solicitud de producto de transición.
La copia del código es la siguiente:
fs.open = function (ruta, banderas, modo, devolución de llamada) {
bingding.open (pathmodule._makelong (ruta), stringtoflags (banderas), modo, devolución de llamada);
};
Fs.open abre un archivo basado en la ruta y los parámetros para obtener datos relevantes. La interfaz relacionada con C ++ se llama internamente, y se generará un objeto intermedio durante el proceso, y todos nuestros estados se incluirán ...
PD: No me siento bien después de verlo durante tanto tiempo
Conclusión
Lo anterior se trata de E/S asincrónico en NodeJs. Resumen personal, si hay alguna omisión o error, por favor, indéngalos.