【发布时间】:2019-03-07 13:17:06
【问题描述】:
我正在使用axios 获取/发布数据到我的服务器,我当前的方法如下所示:
1。使用 redux-thunk 的 redux 操作发出请求,操作如下所示:
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) }),
},
};
在这里,我根据 redux 操作类型创建了一个 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 中手动取消它们。
我的问题:
- 如果用户在我的应用中更改页面,是否有办法自动取消正在进行的请求?
- 如果是 - 这是执行此操作的正确方法,还是有更简单的方法来取消请求?
【问题讨论】:
标签: javascript reactjs axios