Um await ausente é um bug de fluxo de controle
Quando uma função async é chamada sem await, a próxima linha recebe uma Promise, não o valor final.
DoesItHold Editorial · · revisado em · guide-js-await-001
Resposta direta
Adicione await no limite em que o valor resolvido é necessário e garanta que a função externa seja async.
Uma função async sempre retorna uma Promise. Sem await, o acesso a propriedades, o cálculo ou a decisão seguinte usa esse objeto, e não o valor resolvido. A falha pode ser imediata, como ler uma propriedade indefinida, ou aparecer somente quando o valor chega a outra camada.
Trate o defeito como um problema de sequenciamento. A pergunta útil não é ‘onde cabe um await?’, mas ‘qual operação precisa primeiro do valor resolvido?’. Manter esse limite estreito preserva a concorrência do trabalho independente e deixa a dependência explícita.
- 01ChamadafetchUser() retorna Promise<User>
- 02Limitename é necessário de modo síncrono
- 03Suspensãoawait cede esta continuação
- 04Retomadauser agora contém o User resolvido
Exemplo mínimo
Deslize para ver todo o código
async function loadName() {
const user = fetchUser();
return user.name;
}async function loadName() {
const user = await fetchUser();
return user.name;
}O que muda: A versão corrigida lê name somente depois que user contém o valor resolvido; a versão com defeito tenta ler a propriedade de Promise<User>.
Método de depuração
Inspecione o valor em execução, siga a Promise até o primeiro consumidor síncrono e coloque await no menor limite que precisa do resultado.
- Inspecione o valor e confirme se ele é uma Promise antes de alterar o código.
- Encontre o primeiro acesso, comparação ou cálculo que precisa do valor resolvido.
- Torne a função externa async, adicione await nesse ponto e mantenha Promises independentes concorrentes.
- Exercite sucesso e rejeição para garantir que a correção não esconda o erro.
Correção incorreta comum
Adicionar timeout, optional chaining ou outra Promise esconde o sintoma; nenhuma dessas opções restaura a sequência necessária. Espalhar await por toda parte também pode serializar trabalho independente.
Limites e casos-limite
O uso de await no nível superior depende do ambiente de script ou módulo, e await dentro de laços pode serializar requisições sem necessidade. Quando as operações forem independentes, inicie-as juntas e aguarde um combinador como Promise.all no ponto em que os resultados forem necessários.