Promises, async/await e a API fetch com uma linha do tempo do event loop passo a passo e 15 exemplos que você pode editar e executar: JSON, formulários, erros, requisições em paralelo, AbortController e retry.
Uma promise representa um resultado que chega mais tarde. Funções async retornam promises, e await pausa essa função até que uma delas seja resolvida. fetch(url) retorna uma promise de um Response: verifique response.ok e depois faça await response.json(). Envolva os awaits em try e catch, use Promise.all para requisições em paralelo e AbortController para cancelar.
O padrão de que a maioria das páginas precisa
Comece pela linha do tempo para ver por que o código depois de um await pode rodar antes dele. Depois edite qualquer exemplo e ele roda de novo na hora. As requisições aqui usam URLs data: ou servidores simulados, então nada sai do seu navegador.
Nenhuma no que eles conseguem fazer: async/await é construído em cima de promises. Uma função async sempre retorna uma promise, e await desembrulha uma. O código fica parecido com código normal passo a passo, o que facilita tratar erros com try e catch.
O fetch trata qualquer resposta HTTP como uma requisição bem-sucedida, porque o servidor respondeu. Ele só rejeita em falhas de rede ou em uma requisição cancelada. Verifique você mesmo response.ok ou response.status.
Os callbacks de promise vão para a fila de microtasks, que é esvaziada por completo depois do script atual. Um callback de timer é uma task, que espera a próxima volta do event loop.
Crie um AbortController, passe controller.signal nas opções do fetch e chame controller.abort(). A promise do fetch é rejeitada com um erro chamado AbortError.
Sim, dentro de módulos JavaScript (script type="module" ou qualquer ES module empacotado). Em scripts clássicos, envolva o código em uma função async.
As linhas síncronas rodam primeiro, depois todos os callbacks de promise na fila (microtasks) e por fim o timer (uma task). Mude a ordem e rode de novo.
Uma promise é resolvida uma única vez: resolve entrega um valor, reject entrega um erro. then e catch rodam depois, nunca na hora.
await pausa só a função async em que está. A linha depois da chamada a main() roda antes de main terminar.
Dentro de uma função async, um await rejeitado lança um erro, então try e catch comuns funcionam. finally é o lugar para esconder um indicador de carregamento.
fetch retorna um Response; .json() lê e interpreta o corpo, o que é um segundo await. Este usa uma URL data: para funcionar offline.
O fetch só rejeita quando a requisição nem consegue ser feita (offline, bloqueada, URL inválida). Um 404 ou 500 resolve normalmente com ok igual a false, então verifique sempre.
FormData lê todos os campos com nome. Aqui a requisição é montada mas não enviada, e o corpo é exibido para você ver exatamente o que um servidor receberia.
Envie JSON convertendo-o em string e definindo você mesmo o cabeçalho Content-Type; o fetch não faz nenhum dos dois para objetos simples.
Qual helper de promise usar
Fazer await de uma chamada por vez soma as esperas. Iniciar todas e fazer await de Promise.all espera só o tempo da mais lenta.
Promise.all rejeita assim que uma falha. allSettled espera todas e diz quais funcionaram, o que combina com dashboards de widgets independentes.
Disparar centenas de requisições de uma vez pode estourar limites de taxa. Este pequeno pool mantém no máximo três em andamento.
Passe controller.signal para o fetch e chame abort() para interrompê-lo. A promise é rejeitada com um AbortError, que você geralmente ignora.
AbortSignal.timeout(ms) cria um sinal que aborta sozinho. Com fetch, o nome do erro é TimeoutError, então dá para diferenciá-lo de um cancelamento feito pelo usuário.
Tente de novo só os erros que podem passar, como um timeout ou um 503, e espere mais a cada vez para que um servidor sobrecarregado possa se recuperar.
Espere uma pausa na digitação e aborte a requisição anterior quando uma nova começar, para que uma resposta antiga e lenta nunca sobrescreva uma mais nova.
Recebeu uma resposta que precisa ler? Cole no
Call stack
Microtasks
Fila de tasks
Console
Etapa {i} de {n}.
Voltar
Próxima etapa
Pausar
Reproduzir
Reiniciar
Comece grátis · Sem cartão de crédito