0Pricing
React Academy · Aula

Condições de corrida e limpeza de efeitos

Use AbortController em useEffect para cancelar solicitações fetch obsoletas durante uma nova renderização.

Condições de corrida e limpeza de efeitos é uma aula grátis de React Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você aprenderá como as condições de corrida acontecem em efeitos do React que obtêm dados e como eliminá-las usando AbortController para realizar a limpeza.

O que é uma condição de corrida?

Uma condição de corrida ocorre quando duas operações assíncronas são concluídas em uma ordem imprevisível. No React, se um usuário navega rapidamente entre itens, uma busca lenta pelo item A pode ser concluída depois da busca pelo item B e exibir dados desatualizados.

O erro: resposta de busca desatualizada

Sem limpeza, se o componente for renderizado novamente com um novo ID antes de a busca antiga ser concluída, as duas buscas serão executadas. A busca mais antiga e lenta pode sobrescrever dados mais recentes no estado.
useEffect(() => {
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => setData(data)); // may run AFTER a newer fetch!
}, [id]);

Correção 1: sinalizador de ignore

Uma correção simples é definir um sinalizador booleano `ignore` no efeito. A função de limpeza o define como verdadeiro. A função de retorno da busca verifica o sinalizador antes de chamar setState.
useEffect(() => {
  let ignore = false;
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => { if (!ignore) setData(data); });
  return () => { ignore = true; };
}, [id]);

Correção 2: AbortController

AbortController é o padrão moderno. Crie um controller no efeito, passe seu sinal para a busca e cancele-o na função de limpeza. A busca lança um AbortError que você pode ignorar.
useEffect(() => {
  const controller = new AbortController();
  fetch('/api/item/' + id, { signal: controller.signal })
    .then(r => r.json())
    .then(data => setData(data))
    .catch(err => {
      if (err.name === 'AbortError') return; // expected
      setError(err.message);
    });
  return () => controller.abort();
}, [id]);

AbortController com funções assíncronas e await

Use try/catch com funções assíncronas dentro de useEffect. Ignore AbortError no bloco de captura.
useEffect(() => {
  const ctrl = new AbortController();
  async function load() {
    try {
      const res = await fetch('/api/' + id, { signal: ctrl.signal });
      const json = await res.json();
      setData(json);
    } catch (e) {
      if (e.name !== 'AbortError') setError(e.message);
    }
  }
  load();
  return () => ctrl.abort();
}, [id]);

A limpeza é sempre necessária

Mesmo quando as condições de corrida são improváveis (por exemplo, uma busca executada uma única vez na montagem), sempre adicione a limpeza. No React 18 StrictMode, os efeitos são executados duas vezes — sem limpeza, a primeira requisição abandonada polui o estado.

A armadilha da assincronicidade de useEffect

A função de retorno de useEffect não pode ser `async`. Defina uma função assíncrona dentro do efeito e chame-a imediatamente — ou use uma função regular com .then()/.catch().
useEffect(() => {
  // useEffect callback is NOT async
  async function fetchData() { /* ... */ }
  fetchData(); // call it
  return () => ctrl.abort();
}, [id]);

As bibliotecas cuidam disso por você

React Query, SWR e RTK Query lidam automaticamente com condições de corrida, abort e limpeza. Ao usar essas bibliotecas, você não precisa escrever manualmente o código de AbortController.

Testando condições de corrida

Para testar condições de corrida manualmente: abra as ferramentas DevTools de rede, limite a conexão a “3G lento” e clique rapidamente entre os itens. Sem limpeza, você verá dados desatualizados aparecerem brevemente. Com AbortController, apenas o último item selecionado será exibido.

Verificação rápida

O que chamar controller.abort() em uma função de limpeza de useEffect faz?

Recapitulação

Condições de corrida ocorrem quando uma resposta de busca desatualizada atualiza o estado depois de uma busca mais recente. Corrija isso com um sinalizador de ignore ou AbortController. Sempre cancele ou ignore na limpeza de useEffect. Bibliotecas como React Query fazem isso automaticamente.

A seguir

Próxima lição: **useTransition para atualizações de interface não bloqueantes** — você envolverá atualizações de estado dispendiosas em startTransition para manter a interface responsiva.

Perguntas Frequentes

A aula “Condições de corrida e limpeza de efeitos” é grátis?

Sim — o texto completo de “Condições de corrida e limpeza de efeitos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Condições de corrida e limpeza de efeitos”?

Use AbortController em useEffect para cancelar solicitações fetch obsoletas durante uma nova renderização. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Condições de corrida e limpeza de efeitos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Condições de corrida e limpeza de efeitos
  2. useTransition para atualizações de interface não bloqueantes
  3. useDeferredValue para controlar a frequência de entradas
  4. Suspense para limites de dados e código
← Voltar para React Academy