Acabo de leer la especificación Promesas / A + y me topé con los términos microtask y macrotask: consulte http://promisesaplus.com/#notes
Nunca he oído hablar de estos términos antes, y ahora tengo curiosidad por saber cuál sería la diferencia.
Ya he intentado encontrar información en la web, pero todo lo que he encontrado es esta publicación de los Archivos de w3.org (que no me explica la diferencia): http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html
Además, he encontrado un módulo npm llamado "macrotask": https://www.npmjs.org/package/macrotask Nuevamente, no se aclara cuál es exactamente la diferencia.
Todo lo que sé es que tiene algo que ver con el bucle de eventos, como se describe en https://html.spec.whatwg.org/multipage/webappapis.html#task-queue y https: //html.spec.whatwg .org / multipage / webappapis.html # perform-a-microtask-checkpoint
Sé que en teoría debería poder extraer las diferencias yo mismo, dada esta especificación WHATWG. Pero estoy seguro de que otros podrían beneficiarse también de una breve explicación dada por un experto.
fuente
while (task = todo.shift()) task();
Respuestas:
Una vuelta del bucle de eventos tendrá exactamente una tarea procesada desde la cola macrotask (esta cola simplemente se llama cola de tareas en la especificación WHATWG ). Una vez que esta macrotask haya terminado, se procesarán todas las microtask disponibles , es decir, dentro del mismo ciclo de recorrido . Mientras se procesan estas microtask, pueden poner en cola aún más microtasks, que se ejecutarán una por una, hasta que se agote la cola de microtask.
¿Cuáles son las consecuencias prácticas de esto?
Si una microtask pone en cola recursivamente a otras microtask, puede pasar mucho tiempo hasta que se procese la próxima macrotask. Esto significa que podría terminar con una IU bloqueada, o algunas E / S terminadas inactivas en su aplicación.
Sin embargo, al menos con respecto a la función process.nextTick de Node.js (que pone en cola las microtask ), existe una protección incorporada contra dicho bloqueo mediante process.maxTickDepth. Este valor se establece en un valor predeterminado de 1000, lo que reduce el procesamiento posterior de microtask después de alcanzar este límite, lo que permite procesar la próxima macrotask )
Entonces, ¿cuándo usar qué?
Básicamente, use microtasks cuando necesite hacer cosas de forma asíncrona de forma sincrónica (es decir, cuando diría que realice esta (micro) tarea en el futuro más inmediato ). De lo contrario, se adhieren a macrotasks .
Ejemplos
macrotasks: setTimeout , setInterval , setImmediate , requestAnimationFrame , I / O , UI rendering
microtasks: process.nextTick , Promises , queueMicrotask , MutationObserver
fuente
process.maxTickDepth
fue eliminado hace mucho tiempo: github.com/nodejs/node/blob/…Conceptos básicos en especificación :
Y el modelo de proceso de bucle de eventos es el siguiente:
cuando la pila de llamadas está vacía, siga los pasos:
Un modelo de proceso simplificado es el siguiente:
Algo para recordar:
fuente
setImmediate()
es macro / tarea yprocess.nextTick()
es un micro / trabajo.paint
tareas del navegador ? ¿En qué categoría encajarían?requestAnimationFrame
)Creo que no podemos discutir el bucle de eventos en separación de la pila, así que:
JS tiene tres "pilas":
Y el bucle de eventos funciona de esta manera:
La pila Mico no se tocará si la pila no está vacía. La pila de macros no se tocará si la micro pila no está vacía O no requiere ninguna ejecución.
En resumen: la cola de microtask es casi lo mismo que la cola de macrotask, pero esas tareas (process.nextTick, Promises, Object.observe, MutationObserver) tienen mayor prioridad que las macrotasks.
Micro es como macro pero con mayor prioridad.
Aquí tienes el código "definitivo" para entender todo.
fuente