JavaScript: Microtasks e Macrotasks

Duas histórias no mesmo Event Loop e suas prioridades

Caótico Mundo Lindo do Event Loop em JavaScript — Créditos da imagem

Dentro do Event Loop do JavaScript, existem dois tipos de tarefas com prioridades bem diferentes, por exemplo:

Mas qual a diferença prática entre os dois? Podemos resumir na seguinte afirmação:

Se alguma Microtask estiver pendente na fila para o Event Loop, ela será executada antes do início do próximo loop (no final do loop atual). Já as Macrotask serão executadas apenas no próximo loop.

Essa definição é importante, pois o resultado de algumas operações podem surpreender os não familiarizados com a engine do JavaScript.

Com isso em mente, qual será o resultado do trecho de código abaixo?

console.log('01-Console');setTimeout(_ => console.log('02-Timeout'), 0);Promise.resolve().then(_ => console.log('03-Promise'));console.log('04-Console');

Antes de olhar a resposta abaixo, você consegue imaginar a saída desse programa?

Uma hora ou outra precisamos saber a resposta…

Ao executar o trecho acima, teremos o seguinte resultado:

$ node tasks.js01-Console
04-Console
03-Promise
02-Timeout

Colocando algumas anotações no código, temos:

console.log('01-Console'); // [A]setTimeout(_ => console.log('02-Timeout'), 0); // [B]Promise.resolve().then(_ => console.log('03-Promise')); // [C]console.log('04-Console'); // [D]

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store