Timeouts/Intervals vs Eventloops

odrumond

Eduardo Drumond

Posted on November 20, 2022

Timeouts/Intervals vs Eventloops

Em qual ordem os consoles serão logados?

Simples exemplo de operação com timeout

timeout executed
last call
finish code
Enter fullscreen mode Exit fullscreen mode

ou

last call
finish code
timeout executed
Enter fullscreen mode Exit fullscreen mode

Se você tem um nível mais intermediário ou sênior, certamente saberá a resposta e não achará grande coisa. Mas se você está começando agora, certamente pode pensar que é um pouco contraintuitivo.


Se você acredita que seja a segunda alternativa, então, meus parabéns, você está certo! Agora você sabe o porquê?


Isso ocorre por causa de uma coisinha do JavaScript chamada de Event Loop.

De maneira bem simplista: o EventLoop é uma fila de mensagens que a runtime do JavaScript executa. Cada mensagem tem uma função associada que é executada no formato de fila (FIFO).

Por se tratar de uma fila, as mensagens mais antigas são processadas antes e, a próxima mensagem só é executada quando a mensagem corrente é finalizada.


Aí você pergunta:

"Okay, mas eu sei também que o runtime interpreta o código na ordem em que é executado, por que mesmo com 0ms no segundo argumento, o 'timeout executed' aparece por último?"

É justamente por isso! Pode parecer estranho, mas o JavaScript, em sua base, é síncrono. Já o setTimeout/setInterval é feito para manipular o EventLoop de forma assíncrona.

Com isto dito, o timeout só será executado depois que todo o código interpretado passar pelo EventLoop do JavaScript.

Quando não houverem mais mensagens na fila do EventLoop, o callback do setTimeout será executado (no caso do snippet, imediatamente, por conta dos 0ms).


É por isso que timeouts e intervalos não são recomendados para usecases que exigem extrema precisão. A depender de quão ocupada a fila de eventos esteja, pode ser que o callback não seja executado no tempo estipulado via parâmetro.


Conclusão / Referências

Intervalos e Timeouts podem ser bem confusos e contraintuitivo se não entendermos algumas partes das "entranhas" do JavaScript, rs.

Links úteis:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

https://ankitkamboj18.medium.com/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-302ee008dfcd

https://medium.com/reactbrasil/como-o-javascript-funciona-o-event-loop-e-o-surgimento-da-programa%C3%A7%C3%A3o-ass%C3%ADncrona-5-maneiras-de-18d0b8d6849a


Off Topic

Esse foi o meu primeiro texto aqui. 😅

Se por algum acaso esse texto chegar até você e lhe der vontade de comentar algo, seja gentil 🫶🏼

Nunca fui muito bom em escrever ou ensinar, mas tracei como objetivo melhorar estes aspectos e cá estou eu, começando agora o que havia prometido começar no início de 2022.
Decidi começar a escrever para melhorar alguns aspectos da minha comunicação e também como forma de estudar/documentar coisas legais de programação. :)

Qualquer crítica construtiva é bem vinda.

💖 💪 🙅 🚩
odrumond
Eduardo Drumond

Posted on November 20, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related