Timeouts/Intervals vs Eventloops
Eduardo Drumond
Posted on November 20, 2022
Em qual ordem os consoles serão logados?
timeout executed
last call
finish code
ou
last call
finish code
timeout executed
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
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.
Posted on November 20, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.