@dabobo/utils
Version:
dabobo utils
83 lines (68 loc) • 2.01 kB
JavaScript
import axios from 'axios';
const pool = {
map: {},
add(id, controller) {
this.cancel(id);
this.map[id] = controller;
},
cancel(id) {
if (id) {
// cancel request: id
const controller = this.map[id];
if (controller) {
controller.abort();
delete this.map[id];
}
} else {
// cancel all requst pool;
Object.keys(this.map).forEach((key) => {
this.map[key].abort();
});
this.map = [];
}
},
};
// request default interceptor
const requestInter = (request) => {
// rid is used to prevent intercepting a request with same url and method but different data or params
const { url, method, rid = 0 } = request;
const id = `${url}&${method}&${rid}`;
const controller = new AbortController();
request.signal = controller.signal;
pool.add(id, controller);
return request;
};
// response default interceptor
const responseInter = (response) => {
const { url, method, rid = 0 } = response.config;
const id = `${url}&${method}&${rid}`;
delete pool.map[id];
return response;
};
// response error
const error = () => {
// pool.cancel();
};
const create = (opt) => {
const instance = axios.create(opt);
const req = instance.interceptors.request.use(requestInter);
const res = instance.interceptors.response.use(responseInter, error);
// 为instance添加删除内置injector方法
instance.interceptors.removeDefault = function() {
instance.interceptors.request.eject(req);
instance.interceptors.response.eject(res);
}
return instance;
};
const defaultRequestInts = axios.interceptors.request.use(requestInter);
const defaultResponseInts = axios.interceptors.response.use(responseInter, error);
axios.pool = pool;
axios.defaultInterceptors = {
request: requestInter,
response: responseInter,
remove() {
axios.interceptors.request.eject(defaultRequestInts);
axios.interceptors.response.eject(defaultResponseInts);
},
};
export default { ...axios, create };