Há alguns anos, escrevi uma postagem no blog sobre como escrever um fetch Promessa que expira. A função era eficaz, mas o código não era muito bom, principalmente porque o AbortController , que permite ao senhor cancelar uma promessa de busca, ainda não existia. Com AbortController e AbortSignal disponíveis, vamos criar uma função JavaScript melhor para buscar com um tempo limite:

AbortSignal As instâncias agora apresentam uma função timeout para cronometrar o tempo que o Promise após um determinado número de milissegundos:

async function fetchWithTimeout(url, opts = {}, timeout = 5000) {
  // Create a signal with timeout
  const signal = AbortSignal.timeout(timeout);

  // Make the fetch request
  const _fetchPromise = fetch(url, {
    ...opts,
    signal,
  });

  // Await the fetch with a catch in case it's aborted which signals an error
  const result = await _fetchPromise;
  return result;
};

// Usage
try {
  const impatientFetch = await fetchWithTimeout('/', {}, 2000);
}
catch(e) {
  console.log("fetch possibly canceled!", e);
}

Enquanto antigamente o AbortSignal viria de um AbortController, o senhor pode agora usar AbortSignal.timeout para criar o sinal.

No momento, porém, somente as versões de navegador de borda suportam AbortSignal.timeout. Assim como a função original, uma função alternativa poderia usar setTimeout para cronometrar o cancelamento, mas usaremos o signal com o fetch pedido:

async function fetchWithTimeout(url, opts = {}, timeout = 5000) {
  // Create the AbortController instance, get AbortSignal
  const abortController = new AbortController();
  const { signal } = abortController;

  // Make the fetch request
  const _fetchPromise = fetch(url, {
    ...opts,
    signal,
  });

  // Start the timer
  const timer = setTimeout(() => abortController.abort(), timeout);

  // Await the fetch with a catch in case it's aborted which signals an error
  try {
    const result = await _fetchPromise;
    clearTimeout(timer);
    return result;
  } catch (e) {
    clearTimeout(timer);
    throw e;
  }
};

// Usage
try {
  const impatientFetch = await fetchWithTimeout('/', {}, 2000);
}
catch(e) {
  console.log("fetch possibly canceled!", e);
}

O código JavaScript acima está muito mais limpo agora que temos uma API adequada para cancelar fetch Promise calls. Anexar o signal à solicitação de busca nos permite usar uma setTimeout com abort para cancelar a solicitação após um determinado período de tempo.

Tem sido excelente ver o senhor AbortController, AbortSignal, e fetch evoluir para fazer async mais controláveis sem alterar drasticamente a API.