UNPKG

@dabobo/utils

Version:

dabobo utils

83 lines (68 loc) 2.01 kB
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 };