Programação Síncrona vs Assíncrona
Programação Síncrona:
- Na programação síncrona, as tarefas são executadas uma após a outra. Cada tarefa aguarda a conclusão da anterior antes de iniciar.
- Isso é simples de entender e seguir, pois o fluxo de controle é linear.
- No entanto, isso pode levar ao "bloqueio", especialmente em operações de entrada/saída. Se uma tarefa demora muito para ser concluída, o programa inteiro é efetivamente interrompido.
console.log("Início");
function fazerAlgo()
{
console.log("Fazendo algo...");
}
fazerAlgo();
console.log("Finalizado");
Saída:
- Início
- Fazendo algo...
- Finalizado
Programação Assíncrona:
- A programação assíncrona permite que as tarefas sejam realizadas em segundo plano, sem bloquear a thread principal de execução.
- O fluxo de controle é devolvido imediatamente, e a tarefa é concluída em algum momento no futuro.
- Isso é particularmente útil no JavaScript, que é uma linguagem single thread. Se você executar uma tarefa de longa duração, como buscar dados de um servidor, isso não bloqueará outras operações, como atualizações da interface do usuário.
- JavaScript sempre teve um forte enfoque em operações assíncronas, devido à sua natureza orientada a eventos. Isso era manipulado através de callbacks muito antes da introdução de Promises/async/await.
console.log("Início");
setTimeout(() => {
console.log("Fazendo algo...");
}, 1000);
console.log("Finalizado");
Saída:
- Início
- Finalizado
- Fazendo algo...
Promises, async, await.
Uma Promise é um objeto que representa a eventual conclusão ou falha de uma operação assíncrona. Isso permite que métodos assíncronos retornem valores imediatos de forma síncronos: em vez de retornar o valor final, porém o método retorna uma 'promessa' de fornecer o valor em algum momento no futuro.
Quando usado antes de uma função, a palavra-chave async torna essa função retornar uma Promise automaticamente. Se a função retorna um valor, a Promise será resolvida com esse valor; se a função lança uma exceção, a Promise será rejeitada com essa exceção.
Quando você usa await em uma função marcada com async, a execução da função é pausada até que a Promise esperada seja resolvida (ou rejeitada). Isso significa que o código após o await dentro da função espera a conclusão da Promise antes de continuar.
Isso permite que os desenvolvedores escrevam código que lida com operações 'bloqueantes' de uma maneira que se parece muito com o estilo síncrono, mas sem os inconvenientes de 'travar' a thread de execução do programa.