Я использую axios
для извлечения / публикации данных на моем сервере, и мой текущий подход выглядит следующим образом:
1.Запрос делается с использованием избыточных действий с redux-thunk
, и действие выглядит так:
export const getRecords = () => (dispatch, getState, { api }) => {
const type = GET_RECORDS_LOAD;
return dispatch({
type,
promise: api.Records.get({ type }),
});
};
2.api.Record.get
выглядит следующим образом:
import _ from 'lodash';
import axios from 'axios';
const APIInstance = axios.create({
baseURL: process.env.API_URL,
});
const getCancelToken = id => new axios.CancelToken((c) => {
const cancel = c;
const cancelationTokens = _.get(window, 'cancelationTokens', {});
cancelationTokens[id] = cancel;
_.set(window, 'cancelationTokens', cancelationTokens);
});
const api = {
Records: {
get: ({ type }) => APIInstance.get('/my-records', { cancelToken: getCancelToken(type) }),
},
};
Здесь я создаю cancelToken
на основе типа действия приставки и сохраняю его в объекте window.cancelationTokens
, поэтому их можно отменить в любом месте изприложение.
3.Отмена на componentWillUnmount
import * as Types from './path/to/action/types';
const cancelToken = (type) => {
const cancel = _.get(window, `cancelationTokens.${type}`);
if (!cancel) return;
cancel();
}
componentWillUnmount() {
cancelToken(Types.GET_RECORDS_LOAD);
// If more request I have to cancel them manually...
}
Как видите, нет серьезных проблем с этим подходом, но если я выполняю большое количество запросов на одной странице, я должен отменить их все вручную в componentWillUnmount
.
Мои вопросы:
- Можно ли автоматически отменить текущий запрос, если пользователь изменит страницу в моем приложении?
- Если да - это правильный способ сделать это, или есть более простой способ отменить запросы?