Depuração prática, passo a passo

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.

Rastreie a falha
  1. 01
    ChamadafetchUser() retorna Promise<User>
  2. 02
    Limitename é necessário de modo síncrono
  3. 03
    Suspensãoawait cede esta continuação
  4. 04
    Retomadauser agora contém o User resolvido
await não bloqueia a thread. Ele suspende esta continuação assíncrona até a Promise terminar e então retoma com o valor resolvido.

Exemplo mínimo

Deslize para ver todo o código

Com defeito
async function loadName() {
  const user = fetchUser();
  return user.name;
}
Corrigido
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.

  1. Inspecione o valor e confirme se ele é uma Promise antes de alterar o código.
  2. Encontre o primeiro acesso, comparação ou cálculo que precisa do valor resolvido.
  3. Torne a função externa async, adicione await nesse ponto e mantenha Promises independentes concorrentes.
  4. 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.

Fontes