Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

A Magia do Event Loop

Posted on Aug 2 O que acontece quando o seguinte código é executado no Node.js?Se a sua resposta foi diferente de:Talvez você não entenda muito bem a ordem de execução do JavaScript e o funcionamento do Event Loop.Sem problemas, vou tentar explicar.Antes de tudo, se você tem dúvidas sobre o que é:Eu recomendo que você leia o glossário antes de continuar.Agora, vamos lá, vou explicar o que acontece em cada etapa da execução desse código JavaScript.O Node interpreta o arquivo JavaScript de cima para baixo, linha por linha, em uma única Thread.A Main Thread interpretará a primeira instrução, adicionará na Call Stack, onde será executada e removida da Call Stack.A instrução setTimeout serve para agendar a execução de uma função após determinados millisegundos. Essa função faz parte da biblioteca libuv, que o Node utiliza para criar um Timer sem bloquear a thread principal. Após iniciar o Timer, a thread principal removerá a instrução da Call Stack.Ao final do intervalo, o timer vai adicionar o callback da função setTimeout na fila de macro-tarefas.Enquanto o Timer da biblioteca libuv espera os 10ms, a Main thread interpretará a próxima linha do arquivo.A instrução da vez é aA thread principal vai executar a função Promise.resolve().then()Promise é um objeto que representa uma conclusão ou falha de uma operação assíncrona.Ao chamar a função resolve() sem nenhum parâmetro, estamos declarando Promise que não retorna valor algum, mas tudo bem.Por ora, estamos mais interessados no comportamento da função .then de uma Promise.Ao passar () => console.log(2) como calback para nossa Promise, estamos dizendo para o Node executar este código assim que a Promise for finalizada com sucesso.Ou seja, estamos dizendo que, assim que o método resolve() da Promise for executado, o Node deverá executar nossa instrução console.log(2).Mas, não é bem assim que funciona.Todo callback de Promise é enviado instantaneamente para uma fila especial chamada Micro Tasks Queue.Esse é o estado atual da execução do script:Tudo que aconteceu até agora, com certeza, levou menos de 10 millissegundos, por isso que o Timer ainda não adicionou a instrução de console.log(1) na Macro Tasks Queue.Mas, por utilizar a libuv, a Main thread pode continuar trabalhando normalmente, de maneira não-bloqueante.Ok, você pode estar se perguntando:Durante todo esse processo, a cada interpretação de nova linha do arquivo, o Event Loop realizou uma função muito importante, embora repetitiva.Como você pode observar, a resposta foi sempre: NÃO!Em nenhum momento durante a execução desse script a Call Stack ficou vazia, então, nosso amigo Event Loop continuará esperando.Agora, a Main Thread interpreta a última instrução do arquivo.Essa é uma instrução simples, que exibe um valor no console, seu resultado é:E, pela primeira vez, a Call Stack fica vazia!Agora sim, o momento mais esperado pelo Event Loop, o momento que ele tem o poder de agir!Ele só vai validar as outras filas quando a Call Stack estiver vazia!Ponto importante: Tudo no JavaScript é feito do começo ao fim.As instruções da Call Stack são consumidas do começo ao fim.O Event Loop processa as tarefas de cada fila do começo ao fim, começando pela fila de micro-tarefas (Micro Tasks) e seguindo para a fila de macro-tarefas (Macro Tasks)Ele:E então, a Main Thread executa a instrução no contexto principal.Por conta disso, todo evento assíncrono é executado no mesmo contexto da thread principal.Agora, continuando a execução do código de exemplo:Quando a Call Stack fica vazia, significa que a Main Thread não está executando nada.Então, o Event Loop consome uma tarefa da Micro Tasks Queue e adiciona à Call StackEm seguida, a Main Thread consome a instrução da Call Stack e a executa.Por ser uma função simples, a Main Thread executa-a rapidamente.Agora, a Call Stack volta a ficar vazia.Então, o Event Loop busca por mais tarefas na fila de Micro Tasks.Como está vazia, ele finaliza o seu trabalho na Micro Tasks Queue e vai começar o mesmo processo na Macro Tasks Queue.Agora, supondo que o intervalo de 10 millisegundos já tenha passado e o Timer tenha inserido a função de console.log(1) na fila de Macro Tasks, o Event Loop transferirá todas as instruções da Macro Tasks Queue para a Call Stack.Então, a Main Thread consome a última instrução da Call Stack e a executa.E é por isso que o resultado do códigoÉÉ isso! Espero que tenha gostado e que você agora entenda a ordem de execução do código JavaScript e como funciona o Event Loop do Node.É uma linguagem de programação de alto nível, dinâmica, interpretada, que suporta múltiplos paradigmas de programação (funcional, imperativo, orientado a objetos). É um "meio" de conversa entre algo que você quer fazer e que o computador executa. É um conjunto de regras que define como o JavaScript deve funcionar, ela define os padrões da linguagem (sintaxe, tipos de dados, estruturas de controle e operadores), e o JavaScript é a implementação desses padrões.Se quiser entender melhor, leia esse artigoÉ o motor que executa o código JavaScript.Ao escrever código JavaScript, você escreve instruções (que seguem as regras definidas pelo ECMAScript), mas para executar essas instruções, você precisa de um Runtime.É como se o JavaScript fosse uma receita e o Runtime fosse um cozinheiro que executa a receita.Node, V8 e SpiderMonkey são os runtimes JavaScript mais conhecidos do mundo.Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well Confirm For further actions, you may consider blocking this person and/or reporting abuse makidotai - Jul 4 makidotai - Jul 4 mankaa - Jul 8 christine - Jul 26 Once suspended, ocodista will not be able to comment or publish posts until their suspension is removed. Once unsuspended, ocodista will be able to comment and publish posts again. Once unpublished, all posts by ocodista will become hidden and only accessible to themselves. If ocodista is not suspended, they can still re-publish their posts from their dashboard. Note: Once unpublished, this post will become invisible to the public and only accessible to Caio Borghi. They can still re-publish the post if they are not suspended. Thanks for keeping DEV Community safe. Here is what you can do to flag ocodista: ocodista consistently posts content that violates DEV Community's code of conduct because it is harassing, offensive or spammy. Unflagging ocodista will restore default visibility to their posts. DEV Community — A constructive and inclusive social network for software developers. With you every step of your journey. Built on Forem — the open source software that powers DEV and other inclusive communities.Made with love and Ruby on Rails. DEV Community © 2016 - 2023. We're a place where coders share, stay up-to-date and grow their careers.



This post first appeared on VedVyas Articles, please read the originial post: here

Share the post

A Magia do Event Loop

×

Subscribe to Vedvyas Articles

Get updates delivered right to your inbox!

Thank you for your subscription

×