axios 封装带请求频繁取消上一次请求

版权声明:一个被隔壁肥宅嘲笑的... https://blog.csdn.net/weixin_38641550/article/details/84940663

axios 封装 首先引入axios 创建实例

import axios from 'axios'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  timeout: 6000 // 请求超时时间
})

然后加入axios的拦截器

service.interceptors.request.use(
  config => {
    return config
  },
  (error, response) => {
    console.log(error)
    console.log(response)
  }
)

service.interceptors.response.use(
  response => {
    return response.data
  }, error => {
    console.log(error)
    return Promise.reject(error)
  }
)
export default service

这个就简单的处理了封装 然后我们继续封装  判断用户的token根据用户token给请求头

即在拦截器请求判断你的用户是不是登录了(这里用到了js-cookie)

import Cookies from 'js-cookie'
if (Cookies.get('Admin-Token')) {
      config.headers['Authorization'] = Cookies.get('Admin-Token')
    }

这里正常的封装就完事了

然后我们加入 当多次请求的时候去除上一次请求

let pending = []
let CancelToken = axios.CancelToken

let cancelPending = (config) => {
  pending.forEach((item, index) => {
    if (config) {
      if (item.UrlPath === config.url) {
        item.Cancel() // 取消请求
        pending.splice(index, 1) // 移除当前请求记录
      };
    } else {
      item.Cancel() // 取消请求
      pending.splice(index, 1) // 移除当前请求记录
    }
  })
}

我们用一个数组包含所有请求 在每次请求的时候判断是不是刚刚请求了 如果请求了就取消这个请求

表现出来的就是这样了

具体代码在这里:

import axios from 'axios'
import Cookies from 'js-cookie'

let pending = []
let CancelToken = axios.CancelToken

let cancelPending = (config) => {
  pending.forEach((item, index) => {
    if (config) {
      if (item.UrlPath === config.url) {
        item.Cancel() // 取消请求
        pending.splice(index, 1) // 移除当前请求记录
      };
    } else {
      item.Cancel() // 取消请求
      pending.splice(index, 1) // 移除当前请求记录
    }
  })
}

// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  timeout: 600000 // 请求超时时间
})

service.interceptors.request.use(
  config => {
    if (Cookies.get('Admin-Token')) {
      config.headers['Authorization'] = Cookies.get('Admin-Token')
    }
    cancelPending(config)
    config.cancelToken = new CancelToken(res => {
      pending.push({'UrlPath': config.url, 'Cancel': res})
    })
    return config
  },
  (error, response) => {
    console.log(error)
    console.log(response)
  }
)

service.interceptors.response.use(
  response => {
    cancelPending(response.config)
    return response.data
  }, error => {
    console.log(error)
    return Promise.reject(error)
  }
)
export default service

猜你喜欢

转载自blog.csdn.net/weixin_38641550/article/details/84940663