Promises, async/await e fetch em JavaScript

Promises, async/await e fetch em JavaScript: 15 exemplos executáveis | We.Inc

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.

Promises, async/await e fetch em JavaScript

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.

Perguntas frequentes

Qual a diferença entre promises e async/await?

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.

Por que o fetch não lança erro em um 404?

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.

Por que setTimeout com 0 roda depois de uma promise resolvida?

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.

Como cancelo uma requisição fetch?

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.

Posso usar await no nível superior?

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.

Erros que você vai ver

Usando isso em um site real

Promises e async/await

1. O que roda quando

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.

2. Criando uma promise

Uma promise é resolvida uma única vez: resolve entrega um valor, reject entrega um erro. then e catch rodam depois, nunca na hora.

3. A mesma coisa com async e await

await pausa só a função async em que está. A linha depois da chamada a main() roda antes de main terminar.

4. Erros com try, catch e finally

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 para tarefas reais de sites

5. Carregar JSON com fetch

fetch retorna um Response; .json() lê e interpreta o corpo, o que é um segundo await. Este usa uma URL data: para funcionar offline.

6. Para o fetch, um 404 não é erro

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.

7. Enviar um formulário com fetch

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.

8. POST de JSON

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.

Várias requisições ao mesmo tempo

Qual helper de promise usar

9. Sequencial versus paralelo

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.

10. Promise.all versus Promise.allSettled

Promise.all rejeita assim que uma falha. allSettled espera todas e diz quais funcionaram, o que combina com dashboards de widgets independentes.

11. Muitas requisições, poucas por vez

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.

Cancelar, timeout, retry

12. Cancelar com AbortController

Passe controller.signal para o fetch e chame abort() para interrompê-lo. A promise é rejeitada com um AbortError, que você geralmente ignora.

13. Desistir depois de um timeout

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.

14. Retry com backoff

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.

15. Busca enquanto digita, sem resultados velhos

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

formatador de JSON

Linha do tempo do event loop

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

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site