123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import axios from "axios";
- import { ElMessage } from 'element-plus'
- // 创建一个axios实例
- const request = axios.create({
- baseURL: import.meta.env.VITE_APP_API_URL,
- timeout:20000, //请求超时时间 20秒
- })
- // 对于重复的post请求,只处理第一次请求,后续重复的请求在上一次返回之前都取消
- const postRequestList=new Set()
- // 需要储存每次请求对应的取消方法
- let lastGetRequestList=new Map()
- // 取消方法
- const removePreRequest=(Url,fun)=>{
- // console.log(lastGetRequestList);
- if(lastGetRequestList.has(Url)){
- // 取消上一次请求
- lastGetRequestList.get(Url)(`${Url}---重复请求被中断`)
- // 设置 新的取消方法
- lastGetRequestList.set(Url,fun)
- }
- }
- request.interceptors.request.use(
- config=>{
- config.headers['Authorization'] = localStorage.getItem('fsms_token') || ''
- // 不处理get请求
- if (config.method !== 'get') {
- // 利用axios cancelToken 先取消请求
- config.cancelToken = new axios.CancelToken(e => {
- // 在这里取消重复请求,上个请求未完成时,相同的请求不会再次执行
- postRequestList.has(config.url) ? e(`${config.url}---重复请求被中断`) : postRequestList.add(config.url)
- })
- }else if(config.params?.takeLastRequestResult){
- // 对于get请求中的参数有 takeLastRequestResult 且值为真 进行特殊处理,若重名 请不要更改这个名字
- config.cancelToken = new axios.CancelToken((c)=>{
- lastGetRequestList.has(config.url) ? removePreRequest(config.url,c) : lastGetRequestList.set(config.url,c)
- });
- // 去除参数中的 takeLastRequestResult
- if(config.params){
- config.params.takeLastRequestResult=undefined
- }
- }
- return config
- },
- err=>{
- console.log(err);
- return Promise.reject(err)
- }
- )
- request.interceptors.response.use(
- res=>{
- postRequestList.delete(`${res.config.url}`)
- lastGetRequestList.delete(`${res.config.url}`)
- if(res.request.responseType.toLowerCase()==='blob'){
- // 字节流
- if(res.status === 200){
- return res.data
- }
- }else if(res.data.code==200){
- return res.data
- }else if(res.data.code==4010 || res.data.code==401){
- // 4010 禁用操作 401 token过期
- ElMessage({
- message:res.data.msg || '未知错误,请重新登录',
- type:'error',
- duration:1500
- })
- localStorage.removeItem('fsms_token')
- localStorage.removeItem('userInfo')
- setTimeout(()=>{
- location.reload()
- },1500)
- return Promise.reject(new Error(res.data.msg ||'未知错误,请重新登录'))
- }else{
- ElMessage({
- message:(res.data && res.data.msg) ? res.data.msg : '网络异常',
- type:'error',
- duration:3*1000
- })
- return Promise.reject(new Error(res.data.msg ||'网络异常'))
- }
- },
- err=>{
- const {message} = err
- console.log(message,'--错误信息');
- if(!err.__CANCEL__){
- // 清除
- postRequestList.clear()
- lastGetRequestList.clear()
- // 多次点击由CancelToken取消的请求不给错误提示
- ElMessage({
- message: message || '网络异常',
- type: 'error',
- duration: 3 * 1000
- })
- }
- return Promise.reject(err)
- }
- )
- export default request
|