directorio
js modelo single-roscado
JavaScript es de un solo subproceso, no bloqueando un idioma, sólo hay un hilo conductor, pero sólo se puede realizar una tarea.
js solo uso-roscados con el fin de simplificar
js la pila, montón y de colas de mensajes
montón
Se almacena en el registro de función de llamada - marco de llamada
montón
Se almacena en el objeto
Message Queue
- A la espera de mensajes de colas comprenden
- Cada mensaje está asociado con una función de devolución de llamada para procesar el mensaje.
bucle de eventos
¿Cuál es el ciclo de eventos Evento Loop
Evento Loop es un mecanismo de comprobación de bucle
- Cuando el hilo principal la ejecución de la tarea, será ver si hay una tarea cola de mensajes asíncronos para satisfacer las condiciones (js tareas en la cola de mensajes se denomina tarea asincrónica).
- Si es así, las tareas asíncronas se vuelven transferidos a las principales tareas de sincronización hilo, y luego realizar su función de devolución de llamada asociado
- Entonces ciclo continuo, si la tarea es llevar a cabo la cola de tareas de todo, el programa termina.
El hilo principal
Tareas sincrónicas y asincrónicas Tareas
tarea de sincronización
No se suspende, la cola de ejecución de la tarea en el hilo principal
tareas asíncronas
Las tareas se dividen en macro y micro-tareas
tarea macro
Incluyendo:
incluyendo el Código generalscript、setTimeout、setInterval、setImmediate、I/O、UI rendering
Micro-tarea
incluyendo:
promise.then, process.nextTick(node中)
Para la ejecución de tareas macro antes de la micro-tarea
bucle de eventos Proceso
Cuando la ejecución de la tarea, la primera aplicación como un código conjunto para esta [tarea macro], después de la tarea principal de sincronización de subprocesos vació, compruebe la lista de tareas micro, si no está vacío después se añadió a la principal un hilo por una ejecución; después de lista de tareas micro vaciar, la ejecución de la tarea macro, Si la ejecución de la tarea de macro después de la finalización de una lista de micro-tarea no está vacío, seguido de la aplicación de micro-tarea hasta que el micro vacío tarea, a continuación, realizar la tarea macro, esto se ha distribuido a todas las listas de tareas vaciados bucle de eventos finales.
Ejemplo:
console.log(1); //1.同步任务#1
setTimeout(function(){ //1.宏任务加入marcotask $1
console.log(2);
new Promise(function(resolve){
console.log(3);
setTimeout(function(){ //$3
console.log(4);
});
resolve();
}).then(function(){ //&2
console.log(5);
});
});
new Promise(function(resolve){ //1.promise 是同步任务!!!#2
console.log(6);
setTimeout(function(){ //1.加入宏任务队列 $2
console.log(7);
});
resolve();
}).then(function(){ //1.微任务加入microtask &1
console.log(8);
});
console.log(9); //1.同步任务#3
Resultados de 169.823.574
- En primer lugar # 1 realizan tareas de sincronización encontraron
setTimeout
macro tarea $ 1 añadido a lamacrotask
cola, se reunieronpromise
para la tarea de sincronización # 2, de ejecución directa,promise
la ejecución se ejecutasetTimeout
la tarea macro $ 2, unirse amacrotask
la cola, se reunieronthen()
para unirse a la cola de micro-tarea y, a continuación tareas Sincronizar # 3 , el primer extremo del bucle de eventos;
caso: salida el resultado [169]
. macrotask: $ 2 $ 1
Microtask :. 1 y - 1 y la realización de tareas micro, salida de sincronización de tareas [8], cola de micro-vacío, realiza macrotask
- La ejecución de la tarea macro $ 1, para realizar la salida tarea de sincronización [2], se reunieron
promise
para llevar a cabo sus tareas de sincronización, la salida [3], se encontró consetTimeout
macro tarea $ 3, se unenmacrotask
, se reúnenthen()
y 2, la adiciónmicrotask
, $ 1 tarea macro está acabado,microtask
no está vacío, por lo junto a realizar tareas de micro. - tarea lista de tareas Micro ejecución: & 2, la salida de [5], después del final de la cola está vacía la micro, ejecución de la tarea macro
- $ 2 de ejecución de tareas macro, de salida [7], finaliza la ejecución
- $ 3 Ejecución tarea macro, la producción [4], finaliza la ejecución
- En este momento, todas las colas vacías, al final del ciclo de eventos.
Resumen: El primer macro para realizar una tarea, entonces todos los micro-tareas en ejecución, y así sucesivamente;