Promises e Async/Await
Algumas operações — buscar dados de um servidor, ler um arquivo, esperar um temporizador — não terminam imediatamente. O JavaScript lida com isso com uma Promise: um valor que representa algo que vai se completar depois, seja com sucesso ou com um erro.
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
console.log("Starting...");
delay(100).then(() => {
console.log("100ms have passed");
});Starting... 100ms have passed
delay(100) retorna uma Promise imediatamente, sem bloquear nada — "Starting..." é impresso na hora. .then() registra uma função para rodar assim que a promise resolver, o que acontece 100ms depois quando o temporizador termina.
async/await — escrevendo código async que se lê como código síncrono
await pausa uma função naquela linha até a promise resolver, sem bloquear o resto do programa — ele apenas faz o código assíncrono se ler de cima para baixo, em vez de aninhar callbacks dentro de .then().
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function main() {
console.log("Starting...");
await delay(100);
console.log("100ms have passed");
}
main();Starting... 100ms have passed
Mesmo resultado da versão com .then() acima, mas async/await geralmente é considerado mais fácil de ler quando você tem mais de um passo assíncrono seguido. Uma função marcada como async sempre retorna uma Promise, e await só pode ser usado dentro de uma.
A seguir: módulos e a biblioteca padrão — organizando código entre arquivos, e o que já vem pronto.
Exercício de Prática
Escreva uma função async getValue() que retorne 42, e depois aguarde-a (await) dentro de outra função async e imprima o resultado.