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.
Top comments (0)