AnyCompiler

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");
});
Output
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();
Output
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.