axios 封装带请求频繁取消上一次请求 + 全局loading

resful配置自己配置吧我懒的写

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) // 移除当前请求记录
    }
  })
}

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

表现出来的就是这样了

全局loading:

先引入element的loading 

import { Loading } from 'element-ui'

let loading

添加函数设置loading展示隐藏

let startLoading = () => { // 使用Element loading-start 方法
  loading = Loading.service({
    lock: true,
    text: '加载中……'
    // background: 'rgba(0, 0, 0, 0.7)'
  })
}
let endLoading = () => { // 使用Element loading-close 方法
  loading.close()
}

然后在拦截器中添加函数

具体代码在这里:

import axios from 'axios'
import Cookies from 'js-cookie'
import { Loading } from 'element-ui'
let loading
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) // 移除当前请求记录
    }
  })
}

let startLoading = () => { // 使用Element loading-start 方法
  loading = Loading.service({
    lock: true,
    text: '加载中……'
    // background: 'rgba(0, 0, 0, 0.7)'
  })
}
let endLoading = () => { // 使用Element loading-close 方法
  loading.close()
}
// 创建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})
    })
    startLoading()
    return config
  },
  (error, response) => {
    console.log(error)
    console.log(response)
  }
)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章