Menu
CoddyTech

O loop de eventos

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 26 de 33.

Callbacks e promises são executados mais tarde, e os bugs se escondem quando não se sabe exatamente quando.

O Node primeiro executa todo o código síncrono até o fim. Depois, executa as microtarefas: callbacks de promises e funções passadas para queueMicrotask. Só então vêm os temporizadores. setTimeout(fn, ms) executa fn uma vez, após ms milissegundos. Até mesmo setTimeout(fn, 0) espera até que as microtarefas terminem.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

Um atraso de 0 significa o mais rápido possível após as microtarefas, nunca antes delas. Os temporizadores disparam na ordem do atraso; quando os atrasos são iguais, o temporizador configurado primeiro dispara primeiro.

challenge icon

Desafio

Fácil

O Node executa seu código em uma ordem fixa. Primeiro, as linhas normais, depois as microtarefas, como callbacks de promises, e então os temporizadores. Use essa ordem para fazer quatro linhas serem exibidas em ordem numérica sem movê-las.

order.js exibe suas quatro linhas de 4 até 1. Não mova nem reordene as linhas. Em vez disso, envolva três delas para que sejam executadas depois.

  1. Deixe console.log('1 sync') como está. O código normal é executado primeiro.
  2. Envolva a linha 2 microtask em queueMicrotask, para que ela seja executada logo depois do código normal.
  3. Envolva a linha 3 timeout e a linha 4 timeout later, cada uma em seu próprio setTimeout. setTimeout(fn, ms) executa a função fn uma vez, ms milissegundos depois. A linha 4 é configurada antes da linha 3, então ela precisa de um atraso maior.

node order.js então exibe:

1 sync
2 microtask
3 timeout
4 timeout later

Experimente: antes de executar, tente adivinhar a ordem. Depois, pressione Executar; o terminal mostra $ node order.js. Em seguida, defina o atraso dos dois temporizadores como 0 e execute novamente: 4 timeout later agora aparece antes de 3 timeout, porque, quando os atrasos são iguais, o temporizador configurado primeiro é executado primeiro. Coloque o atraso maior de volta na linha 4 antes de pressionar “Verificar”.

Experimente você mesmo

// Faça estas linhas imprimirem na ordem numérica sem movê-las.
// Em vez disso, envolva-as em queueMicrotask e setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos de Node.js

Pratique por conta própria: Playground de Express