// 获取CancelToken const CancelToken = axios.CancelToken; const source = CancelToken.source(); // http request 拦截器 axios.interceptors.request.use( (config) => { // 全局添加cancelToken newConfig.cancelToken = source.token; return newConfig; }, (err) => { const error = err; return Promise.reject(error); } ); // http response 拦截器 axios.interceptors.response.use((response) => { const code = response.data.code; if (code == '002') { // 某个请求的响应满足特定条件的情况下,取消【其他正在进行的请求】 source.cancel(); } return Promise.resolve(response.data); }, (error) => { if (axios.isCancel(error)) { // 取消请求的情况下,终端Promise调用链 return new Promise(() => {}); } else { return Promise.reject(error); } });
Ps1:source.cancel():取消的是其他正在进行的请求,而不是中断自己的拦截器请求,所以该代码只有在有其他请求出现的时候,才会生效,否则不起作用,如果放在请求的 then 方法体内也不起作用,因为人家请求都已经完成了才进到 then 或 catch 里,已经不在你(source.cancel)的作用范围里了。
Ps2:return new Promise(() => {}):核心代码,可以中断自己本身,如拦截器请求。