FNSP Web Page

Os quatro erros clássicos com async/await

O async/await tornou o código assíncrono legível como se fosse sequencial. E é precisamente por parecer sequencial que se cometem estes quatro erros — todos eles passam despercebidos em desenvolvimento.

1. Esperar por coisas que não dependem umas das outras

// 900 ms: três esperas de 300 ms, uma atrás da outra
const artigos = await lerArtigos();
const tags = await lerTags();
const sondagem = await lerSondagem();

// 300 ms: as três ao mesmo tempo
const [artigos, tags, sondagem] = await Promise.all([
  lerArtigos(),
  lerTags(),
  lerSondagem(),
]);

A regra: await em série só quando o segundo pedido precisa do resultado do primeiro.

2. O forEach que não espera

artigos.forEach(async (artigo) => {
  await publicar(artigo);
});

console.log('publicados'); // mentira: nenhum acabou ainda

O forEach ignora o valor devolvido pelo callback, portanto ignora a promessa. Ou se usa um ciclo for, que espera de verdade, ou se usa o Promise.all:

// Um de cada vez, pela ordem
for (const artigo of artigos) await publicar(artigo);

// Todos ao mesmo tempo
await Promise.all(artigos.map(publicar));

3. O await esquecido

try {
  guardar(dados); // faltou o await
} catch (erro) {
  console.error('não guardou'); // nunca corre
}

Sem o await, a função devolve uma promessa e o try termina antes de ela falhar. O erro sai fora do bloco, como rejeição não tratada — e o utilizador vê uma mensagem de sucesso sobre uma gravação que não aconteceu. É o erro mais caro dos quatro, e o mais fácil de cometer.

4. Promise.all quando devia ser allSettled

// Uma falha deita fora os resultados das outras nove
const respostas = await Promise.all(pedidos);

// Cada uma responde por si
const resultados = await Promise.allSettled(pedidos);

const boas = resultados.filter((r) => r.status === 'fulfilled').map((r) => r.value);
const falhas = resultados.filter((r) => r.status === 'rejected');

O Promise.all falha à primeira, e é o que se quer quando são todas essenciais. Quando são independentes — enviar dez notificações, atualizar cinco caches — o allSettled é o certo.

Comentários

Ainda ninguém comentou este artigo.

Voltar ao blog

Gostávamos de saber quantas pessoas visitam o site, com o Google Analytics. Sem a sua autorização não corre nada. Política de Privacidade.