Entendendo o Javascript Assíncrono

Javascript é uma linguagem de programação single-threaded, o que significa que há apenas uma thread principal responsável por sincronizar o estado da aplicação. Contudo, eventos podem ser manipulados por outras threads, permitindo que o Javascript seja assíncrono. O mecanismo de eventos (Event Loop) é o que torna isso possível.

O Event Loop  funciona como uma fila de eventos, processando os eventos na ordem em que são adicionados a essa fila. O Event Loop é composto por uma pilha de chamadas e uma fila de eventos, sendo responsável por garantir que o código seja executado de forma assíncrona e é fundamental para entender como o Javascript funciona.

Código síncrono é mais fácil de prever, entender o fluxo e desenvolver. No entanto, o comportamento síncrono não reflete o funcionamento do computador, que é assíncrono por natureza. Por essa razão, o uso de código assíncrono é recomendado em muitos casos. Isso permite melhorar a performance da aplicação e aproveitar melhor o poder de processamento.

Javascript é uma linguagem interpretada, o que significa que o código é executado linha por linha em tempo real. Isso pode levar a problemas de performance quando o código é executado de forma síncrona e bloqueante, especialmente quando há operações que levam mais tempo para serem concluídas, como o acesso a um banco de dados ou a uma API externa. Essas operações podem fazer com que a execução do código seja interrompida por um longo período de tempo, causando lentidão na aplicação.

O uso de código assíncrono pode ajudar a resolver esse problema, permitindo que o código continue sendo executado enquanto essas operações são realizadas em segundo plano. Uma das formas de lidar com código assíncrono é por meio de callbacks.

Um callback em Javascript é uma função que é passada como argumento para outra função e será chamada quando a operação assíncrona da função principal for concluída. Ele permite que a execução assíncrona de uma função seja interrompida para que outras operações possam ser executadas e notifica a função chamadora quando a operação assíncrona for concluída.

const fs = require("fs");

fs.readFile("someFile.txt", (error, data) => {
	// Ação para quando o arquivo for carregado
});

console.log("Mensagem exibida antes do arquivo ser carregado");
Exemplo de código assíncrono

As Promises também são particularmente úteis nesse caso, pois permitem que o código espere por uma operação assíncrona ser concluída antes de continuar a execução. Isso pode ajudar a evitar problemas como a execução de código antes que os dados necessários estejam disponíveis.

Uma Promise em Javascript é um objeto que representa um valor que pode não estar disponível no momento em que a Promise é criada. Ela é usada para tratar o resultado ou o erro de uma operação assíncrona quando ela for concluída. As Promises têm três estados possíveis: pendente, concluída com sucesso ou rejeitada com erro. Elas são uma maneira mais fácil de lidar com operações assíncronas do que o uso de callbacks, especialmente quando há várias operações envolvidas.

console.log('início');

await fetch('https://viacep.com.br/ws/01001000/json/')
	// ação executada ao concluir com sucesso
	.then(response => console.log(response))
	// ação executada quando algum erro for encontrado
	.catch(error => console.log(error));

console.log('fim');
Exemplo de Promise

É importante lembrar que o uso de código assíncrono também pode ser mais complicado em alguns casos. Por exemplo, quando há várias operações assíncronas sendo realizadas em paralelo, pode ser difícil controlar o fluxo de execução e garantir que as operações sejam realizadas na ordem correta. Em geral, o uso de código assíncrono pode melhorar significativamente a performance da aplicação, mas é importante ter em mente os desafios envolvidos e escolher as técnicas mais apropriadas para cada situação.