axios 路由跳轉取消請求

1.store:

(1)state:

const state = {
  axiosCancelTokens: [] // axios取消請求的token集合
}

(2)mutation-types:

export const AXIOS_PUSH_TOKEN = 'AXIOS_PUSH_TOKEN' // 添加新的axios請求
export const AXIOS_CLEAR_TOKEN = 'AXIOS_CLEAR_TOKEN' // 清楚axios請求

(3)mutations:

import * as types from './mutation-types'
import { constAxios } from '@/utils/constant'

export default {
  [types.AXIOS_PUSH_TOKEN]: (state, src) => {
    state.axiosCancelTokens.push(src.cancelToken)
  },
  [types.AXIOS_CLEAR_TOKEN]: ({axiosCancelTokens}) => {
    axiosCancelTokens.forEach(item => {
      item(constAxios.requestCancelDesc)
    })
    axiosCancelTokens = []
  }
}

2.router:

import store from '@/store'
import * as types from '@/store/mutation-types'

// 導航守衛
router.beforeEach((to, from, next) => {
  store.commit(types.AXIOS_CLEAR_TOKEN)// 取消請求
  next()
})

3.axios:

/**
 * @file request.js axios配置
 */

import axios from 'axios'
import { MessageBox, Indicator, Toast } from 'mint-ui'
import { getStore, loginOut } from '../utils/index'
import store from '@/store'
import * as types from '@/store/mutation-types'
import { constAxios } from '@/utils/constant'

// 創建axios實例
const service = axios.create({
  baseURL: process.env.NODE_ENV === 'development' ? '' : process.env.BASE_API,
  timeout: constAxios.timeout // 請求超時時間
})

axios.defaults.headers.post['Content-Type'] = 'application/json-patch+json'
axios.defaults.retry = 3
axios.defaults.retryDelay = 1000

// 添加請求攔截器
service.interceptors.request.use((config) => {
  // 添加請求
  config.cancelToken = new axios.CancelToken((cancel) => {
    store.commit(types.AXIOS_PUSH_TOKEN, {
      cancelToken: cancel
    })
  })
  // ...
  return config
}, (error) => {
  return Promise.reject(error)
})

service.interceptors.response.use(response => {
  // 對響應數據做些事
  // 1.關閉加載提示框
  Indicator.close()
  // 2.判斷接口訪問成功與否
  var result = response.data
  if (response.status !== 200) {
    MessageBox('提示', '接口訪問失敗,失敗狀態:' + response.status)
    return Promise.reject(response.status)
  } else if (!result.success) {
    var msg = result.msg
    MessageBox('提示', msg)
    return Promise.reject(msg)
  } else {
    return result
  }
}, (error) => {
  // 請求錯誤時做些事
  // 關閉加載提示框
  Indicator.close()
  // 判斷是否是因爲路由跳轉取消請求
  if (error.message !== constAxios.requestCancelDesc) {
    // 判斷是否是請求超時
    var originalRequest = error.config
    if (error.code === 'ECONNABORTED' && error.message.includes('timeout') && !originalRequest._retry) {
      var config = error.config
      MessageBox.alert('網絡好像不太給力,請稍後再試').then(action => {
        originalRequest._retry = true
        return service.request(config)
      })
    } else if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
      Toast({
        message: `請求超時!`,
        position: 'bottom'
      })
    } else if (error.response) {
      if (error.response.status === 401) {
        // MessageBox.alert('抱歉,您沒有此操作權限!').then(action => {
        //   // loginOut()
        // })
      } else {
        MessageBox('提示', `接口訪問失敗:${error.message}(${error.response.status})`)
      }
    } else {
      MessageBox('提示', '接口訪問失敗,' + error.message)
    }
  }
  return Promise.reject(error)
})

export default service

4.constant:常量

/**
 * 常量集合
 */

/**
 * axios取消請求的描述
 */
export const AXIOS_REQUEST_CANCEL = '取消請求'

5.參考:

(1)axios npm:https://www.npmjs.com/package/axios
(2)路由跳轉取消請求:https://blog.csdn.net/echo_Ae/article/details/89174777

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