Como Cancelar Requisições HTTP com AbortController no JavaScript

Como Cancelar Requisições HTTP com AbortController no JavaScript

Disparar múltiplas requisições sem cancelar as anteriores pode gerar race conditions, consumo desnecessário de dados e vazamentos de memória. O AbortController resolve esse problema permitindo interromper requisições do fetch pendentes quando o usuário altera a navegação ou dispara uma nova ação.

JavaScript

// Instancia o controlador para gerenciar o cancelamento
let controller = null;

async function buscarDados(url) {
  // Se houver uma requisição em andamento, cancela antes de iniciar a nova
  if (controller) {
    controller.abort('Requisição anterior cancelada pelo usuário.');
  }

  // Cria uma nova instância de AbortController para a requisição atual
  controller = new AbortController();
  const { signal } = controller;

  try {
    // Passa o sinal de cancelamento nas opções do fetch
    const response = await fetch(url, { signal });
    const data = await response.json();
    console.log('Dados recebidos:', data);
  } catch (error) {
    // Trata especificamente o erro de cancelamento
    if (error.name === 'AbortError') {
      console.warn('Requisição cancelada com sucesso:', error.message);
    } else {
      console.error('Erro na requisição:', error);
    }
  } finally {
    // Reseta a referência quando a requisição finalizar
    controller = null;
  }
}

// Exemplo Prático: Simulando chamadas consecutivas (ex: busca ao digitar)
buscarDados('https://jsonplaceholder.typicode.com/posts/1');

// A segunda chamada é disparada imediatamente, cancelando a primeira
setTimeout(() => {
  buscarDados('https://jsonplaceholder.typicode.com/posts/2');
}, 100);
  • Instância do AbortController: Cria um objeto com a propriedade signal e o método abort(), responsável por disparar o evento de cancelamento.
  • Propriedade signal no fetch: A opção { signal } vincula a requisição HTTP diretamente ao controlador ativo.
  • Tratamento do AbortError: Quando abort() é chamado, a promessa do fetch é rejeitada lançando um erro do tipo AbortError, que deve ser capturado no bloco catch.
  • Limpeza no React/Frameworks: Ideal para ser executado no retorno de um useEffect para cancelar requisições ativas na desmontagem do componente.
  • Motivo customizado: É possível passar uma mensagem ou objeto dentro de controller.abort("motivo") para identificar por que a requisição foi interrompida no bloco catch.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *