Да, такая библиотека есть. Проблема в том, что в JS нативные промисы (Promise) нельзя отменить (not cancelable)... но при этом - у нас есть генераторы, которые вполне себе позволяют имитировать отмену выполнения какой-либо функции, скажем, в середине.
Для того, чтобы все заработало - вам нужно использовать связку из любой понравившейся библиотеки для непосредственно запросов (я предпочитаю
isomorphic-fetch), затем взять redux и middleware для него (редакса) -
redux-saga.
Если вы не знакомы с экосистемой редакса или первый раз слышите про redux-saga - прочтите документацию, посмотрите уроки. Если вкратце - библиотека построена на
генераторах. Функция-генератор возвращает итератор и ее выполнение прекращается каждый раз, когда мы возвращаем итератору новое значение (yield)
Ниже продемонстрирую как это примерно работает:function* myCancelableAction(someData) {
// вернет итератору промис и приостановит работу функции до следующего вызова next
// в нашем случае - функция продолжит выполнение, когда придет ответ сервера
const response = yield doAjaxRequest(someData)
yield dispatchSuccessAction(response)
}
const action = myCancelableAction();
const promise = action.next().value // fetch promise
promise.then(response => {
// если новых запросов не поступило
if(!newRequestIsComing) {
// мы можем передать значение в нашу функцию (через next)
console.log(action.next(response).value); // dispatched action
}
})
Таким образом, после того, как функция вернула значение первый раз, применительно к теме поста это будет "сделай AJAX-запрос", мы можем не выполнять ее дальше (если захотим). Отменить ajax запрос в этом случае не получится, но мы можем просто не учитывать его результаты (не диспатчить success-экшен, например).
UPD1 обновил пример кода