O bug do await ausente em funções async do JavaScript
Numa função async, chamar uma função que retorna uma Promise te dá a Promise, não o valor resolvido. Esqueça o await e a próxima linha lê uma Promise pendente como se o dado já estivesse ali.
A resposta rápida
Adicione await antes da chamada que retorna uma Promise. Sem ele, o valor retornado é um objeto Promise, então ler uma propriedade ou chamar um método no dado esperado não se comporta como você pretende.
Um exemplo mínimo
async function showUser() {
const user = getUser();
console.log(user.name);
}async function showUser() {
const user = await getUser();
console.log(user.name);
}Na versão com bug, response é uma Promise. Por isso, chamar json() sobre ela não lê o corpo já convertido. Com await, response recebe o valor resolvido antes da execução da linha seguinte.
Como depurar
- Encontre toda chamada que retorna uma Promise: fetch, drivers de banco e a maioria das operações de I/O.
- Verifique se o valor retornado é usado diretamente na linha seguinte.
- Siga o valor: se uma Promise é tratada como dado comum, falta um await.
- Adicione await, ou retorne a Promise para que quem chamou possa aguardá-la.
Correções erradas comuns
- Encapsular a chamada em outra Promise em vez de aguardar a que você já tem.
- Adicionar .then num lugar mas deixar o valor sendo usado de forma síncrona logo depois.
- Marcar a função como async sem nunca aguardar a Promise dentro dela.
Limites deste guia
Isto cobre o caso de um único await ausente. Bugs assíncronos reais também incluem rejeições não tratadas, corridas entre awaits concorrentes e ordenação entre event loops. O desafio foca no erro de ordenação mostrado aqui.
Referências oficiais
Pronto para experimentar?
Corrigir este bug em um desafio grátisPáginas relacionadas
Por que um argumento padrão mutável vaza estado em Python
Uma lista usada como argumento padrão em Python é criada uma vez e compartilhada entre chamadas. Veja por que o estado vaza e a correção com guarda None.
Por que um JOIN duplica linhas e como corrigir a cardinalidade
Um JOIN um-para-muitos multiplica linhas, então um cliente com vários pedidos aparece várias vezes. Aprenda a diagnosticar cardinalidade e agregar no grão certo.
Guias
Guias curtos de depuração que explicam um bug comum, mostram uma correção mínima e abrem um desafio grátis correspondente. Navegue pelos guias por linguagem.