请求强制中断

实现原理:

  1. 重复点击提交按钮,重复发生请求
  2. 创建 url请求缓存列表 urlList
  3. 设置axios请求拦截器,调用stopRequestUrl函数,判断是否拦截
  4. 设置axios响应拦截器,调用 dropResponseUrl 函数,把缓存地址列表中的地址抛出去,避免下次请求被拦截
let urlList = []
//判断请求地址是否存在缓存地址列表中
const stopRequestUrl = function (urlList,url,c,errorMessage ) {
	const errorMessage = errorMessage || ''
	if(urlList.some(item => {item == url})){
		return;
	}
} 

//判断响应回来的地址,从缓存地址列表中移除
dropResponseUrl(urlList, url) {
	for (let i = 0; i < urlList.length; i++) {
      if (urlList[i] === url) {
        urlList.splice(i, 1)
        break
      }
    }
}

//请求拦截
service.interceptors.request.use(
    config => {
         // 获取到 token
         let authToken = sessionStorage.getItem('token') || ''
         //设置请求头
         config.headers = {
             'Content-Type': 'application/json',
             'authToken': authToken
         }
		//配置请求响应拦截
         let cancel
         config.cancelToken = new axios.CancelToken(function(c) {
            cancel = c
        })
        // 阻止重复请求。当上个请求未完成时,相同的请求不会进行
        stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
         return config
    },
    error => {
        return Promise.reject(error)
    }
)

//响应拦截
service.interceptors.response.use(
    response => {
        const data = response.data
        // 增加延迟,相同请求不得在短时间内重复发送
        setTimeout(() => {
        allowRequest(reqList, response.config.url)
        }, 2000)
        if(data && data.code==6000){
            Message.error('未登录请重新登录')
            router.push("/login");
        }else{
                return data;
        }
    },
    error => {
        // 增加延迟,相同请求不得在短时间内重复发送
        setTimeout(() => {
            allowRequest(reqList, error.config.url)
        }, 1000)
        if(error.message.includes('请求被中断')){
            return
        }
        Message({
            message: error.message,
            type: 'error',
            duration: 5 * 1000
        })
        
        return Promise.reject(error)
    }
)

你可能感兴趣的:(vue,element-ui,js,vue,axios,js)