setTimeout y la promesa de ejecución secuencial | JavaScript MacroTask cola (cola de tareas macro) y Microtask cola (cola de tareas micro)

Porque esta es la cosa, me sopló una vaca
Aquí Insertar imagen Descripción
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), MutationObservery NodeJs中的 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.
Aquí Insertar imagen Descripción

  • 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

Publicados 131 artículos originales · ganado elogios 451 · vistas 540 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_36667170/article/details/105126891
Recomendado
Clasificación