Недавно я проходил собеседование и мне задали вопрос, к которому я не был готов. Этот вопрос про то, как можно отменить запрос на сервер. На тот момент я не знал ответа и начал исследовать это. В данной статье мы рассмотрим как отменить promise.
До появления fetch мы использовали XMLHttpRequest, у него был метод abort(). Достаточно сохранить ссылку на экземпляр реквеста и в нужное время вызвать метод. Исторически сложилось, что из-за того что мы стали чаще взаимодействовать с сервером, нам стал нужен более удобный инструмент. Этим инструментом стал axios. По сути он является промышленным стандартом.
Если мы говорим об использовании в браузере, то axios обёртка над XMLHttpRequest, а значит у него должен быть метод abort.
В axios для закрытия промиса мы можем передать параметр cancelToken. Далее пример использования:
const CancelToken = axios.CancelToken; const source = CancelToken.source(); axios.get('/user/12345', { cancelToken: source.token }).catch(function (thrown) { if (axios.isCancel(thrown)) { console.log('Request canceled', thrown.message); } else { // handle error } }); axios.post('/user/12345', { name: 'new name' }, { cancelToken: source.token }) // Закрытие запроса (сообщение опционально) source.cancel('Запрос отклонён пользователем');
Подробнее вы можете прочитать по ссылке
Для fetch есть похожее api — AbortController. Пример использования:
let controller = new AbortController(); fetch(url, { signal: controller.signal }); controller.abort();
Отдельно можно использовать некоторые свойства и методы свойства signal.
let controller = new AbortController(); let signal = controller.signal; // срабатывает при вызове controller.abort() signal.addEventListener('abort', () => alert("отмена!")); controller.abort(); // отмена! alert(signal.aborted); // true
Подробнее о AbortController можете прочитать на https://learn.javascript.ru/fetch-abort и https://developer.mozilla.org/ru/docs/Web/API/AbortController.
На данный момент (26.09.2021) isomorphic-fetch не поддерживает AbortController, используйте axios или как-то разделяйте запросы в nodejs и браузере, и используйте стандартный http в nodejs (request.destroy())
Перехожу на новый адрес сайта: https://express.xakplant.ru/. Оцените новый блог, напишите как он вам. Я написал его на next js. Если у вас есть вопросы как соединить nextjs и wordpress, то обязательно напишите их в комментариях.