Автор: Дэвид Уолш
Перевод: сумасшедший технический ботаник
оригинал:Дэвид Уолш Затем /cancel-F и т.д.
Копирование без разрешения строго запрещено
Обещания JavaScript стали большой победой для языка — они вызвали революцию в асинхронном программировании и значительно повысили производительность веб-приложений. Одним из недостатков нативных промисов является то, что на данный момент их нельзя отменить.fetchреальный метод. Добавлены новые в спецификацию JavaScriptAbortController, что позволяет разработчикам прерывать одно или несколько действий с помощью сигналаfetchпередача.
Ниже приведены отменыfetchВызванный рабочий процесс:
- Создавать
AbortControllerпример - Экземпляр имеет
signalАтрибуты - Буду
signalпередан для получения опцииsignal - передача
AbortControllerизabortдля отмены всех выборок, использующих этот сигнал.
Прервать выборку
Вот основные шаги для отмены запроса на выборку:
const controller = new AbortController();
const { signal } = controller;
fetch("http://localhost:8000", { signal }).then(response => {
console.log(`Request 1 is complete!`);
}).catch(e => {
console.warn(`Fetch 1 error: ${e.message}`);
});
// Abort request
controller.abort();
существуетabortпроисходит при вызовеAbortError, так что вы можете прослушать, сравнив имя ошибкиcatchПрервать операцию в .
}).catch(e => {
if(e.name === "AbortError") {
// We know it's been canceled!
}
});
передать один и тот же сигнал несколькимfetchВызов отменит все запросы на этот сигнал:
const controller = new AbortController();
const { signal } = controller;
fetch("http://localhost:8000", { signal }).then(response => {
console.log(`Request 1 is complete!`);
}).catch(e => {
console.warn(`Fetch 1 error: ${e.message}`);
});
fetch("http://localhost:8000", { signal }).then(response => {
console.log(`Request 2 is complete!`);
}).catch(e => {
console.warn(`Fetch 2 error: ${e.message}`);
});
// Wait 2 seconds to abort both requests
setTimeout(() => controller.abort(), 2000);
Джек Арчибальд в своей статьеAbortable fetch, подробно описывает красивое приложение, которое можно использовать для создания прерываемой выборки без всего шаблонного кода:
function abortableFetch(request, opts) {
const controller = new AbortController();
const signal = controller.signal;
return {
abort: () => controller.abort(),
ready: fetch(request, { ...opts, signal })
};
}
Честно говоря, я не в восторге от способа отмены Fetch. В идеальном мире Обещание, возвращенное Fetch,.cancel()Это было бы круто, но это также принесло бы некоторые проблемы. В любом случае я могу отменитьFetchПриятно звонить, и вам тоже!