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.