Porque esta es la cosa, me sopló una vaca
y hermano pequeño realmente me dio una cara preguntas! ! ! No encontré! ! ! (╯¯Д¯) ╯╘═╛
Pero ahora la fuga llena. En este artículo principalmente relacionados con cola de tareas contenido de cola de tareas macro y micro de JavaScript, seguimiento existe la posibilidad de que podría poner en orden el JavaScript asíncrono?
En primer lugar, vamos a pensar en lo que este código es la salida.
const p = new Promise(function(resolve, reject) {
resolve();
setTimeout(() => {
console.log(1);
});
console.log(2);
}).then(res => {
console.log(3);
});
console.log(4);
La respuesta es 2413
No estoy muy confundido no sé por qué ah. JavaScript no se resuelve por debajo de usted, cómo esta orden fue tan confuso. Esto supone un problema asíncrona.
orden de ejecución asíncrona es una especie de cómo se
bloque de código js al analizar parte realizará sección secuencial síncrono, asíncrono será acreditado MacroTask Queue (cola de tareas macro) y Microtask Queue (cola de tareas micro).
MacroTask Queue (cola de tareas macro) incluyen:
setTimeout
,setInterval
,setImmediate
,requestAnimationFrame
,NodeJS中的I/O
,UI渲染
Y así sucesivamente.
Microtask Queue (cola de tareas micro) incluyen principalmente dos categorías:
- devolución de llamada independiente Microtask:
Promise.then catch finally
, su éxito / fallo de la función de devolución de llamada independientes entre sí; - Compuesto Microtask de devolución de llamada:
Object.observe
(obsoleto),MutationObserver
yNodeJs中的 process.nextTick
, en diferentes estados de la misma función de devolución de llamada de la misma;
JS principal ciclo constante hilo de la lectura de la tarea cola de tareas, realizar tareas, que se ejecuta un mecanismo llamado un bucle de eventos (bucle de eventos).
Los bucles proceso sigue:
- Realizar el código de sincronización hasta que termine (realizado para resolver
</script>
tag); - Compruebe la cola de Microtask
- Si las tareas asíncronas que deben abordarse, con el fin de realizar todas las tareas desencadena de forma asincrónica hasta que la aplicación se ha completado y, a continuación, comprobar la cola MacroTask
- Si la tarea asíncrona de no ser tratada, la cola de comprobar directamente MacroTask
- Compruebe la cola MacroTask
- Si las tareas asíncronas de disparo, luego tomar la primera Microtask unirse a la cola, lo procesa, y así sucesivamente, con el fin de realizar todas las tareas continúan hasta el final de la ejecución.
Después de leer esto en la parte superior. Este problema se habrá resuelto.
La figura a continuación me han marcado.
- El código de sincronización
- promesa de crear de inmediato.
- determinación de ejecución ()
- Encuentro setTimeout, no se ejecuta, la macro en la cola de tareas
- Met console.log (2), realizan la salida 2
- .then no lleve a cabo, en la cola de micro-tareas
- console.log Met (4), la salida 4
- Microtask cola:
- La promesa ha .A continuación, realizar la console.log (3) de salida 3
- Microtask cola vacía, la cola de comprobar MacroTask
- MacroTask cola:
- Hay setTimeout, lo puso en una cola de Microtask
- Compruebe la cola de Microtask
- Microtask cola:
- Hay setTimeout, console.log ejecución (1), una salida
- Microtask cola vacía, la cola de comprobar MacroTask
- MacroTask cola:
- Cola está vacía, el final del bucle evento
Estoy tan cansado ah