Axios 二次封装

文件index.js

import axios from 'axios'
import { Modal } from 'antd'
import { HashRouter } from 'react-router-dom'
// Loading组件
import Loading from '../utils/loading'

// http request 请求拦截器
axios.defaults.timeout = 1000 * 60 * 60
axios.defaults.baseURL = '/'

//路由跳转
const { history } = new HashRouter()

// 取消重复的ajax请求
let pending = [] //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let cancelToken = axios.CancelToken
let removePending = ever => {
  for (let p in pending) {
    if (pending[p].key === ever.url + '_' + ever.method) {
      //当当前请求在数组中存在时执行函数体
      pending[p].cancel() //执行取消操作
      pending.splice(p, 1) //把这条记录从数组中移除
    }
  }
}

// http request 拦截器
axios.interceptors.request.use(
  config => {
    Loading.init()
    const { url, headers, method } = config
    config.headers['X-Requested-With'] = 'XMLHttpRequest'
    let mth = method.toLocaleString()
    // 兼容IE method方法 后端接收'_method'参数
    if (['put', 'delete'].indexOf(mth) > -1) {
      config.params
        ? (config.params['_method'] = mth)
        : (config.params = { _method: mth })
      config.method = 'post'
    }
    // 过滤接口访问是否带token权限  --此处可忽略
    let ignore = ['/login', '/forget']
    if (ignore.indexOf(url) < 0) {
      let token = userToken // TODO 接口访问token
      if (token) {
        headers['token'] = token
      } else {
        // 获取token失败 退出登录
        Modal.warning({
          title: '提示',
          content: '账号异常,请重新登录!',
          okText: '确定',
          onOk: () => {
            history.replace({ pathname: '/login' })
          }
        })
        return false
      }
    }
    removePending(config) //在一个ajax发送前执行一下取消操作
    config.cancelToken = new cancelToken(cancel => {
      // 这里的ajax标识key是用【请求地址_请求方式】拼接的字符串,当然你可以选择其他的一些方式
      pending.push({ key: config.url + '_' + config.method, cancel })
    })
    // 兼容IE 防止请求缓存,增加时间戳
    config.url +=
      (config.url.indexOf('?') > -1 ? '&' : '?') + '_t=' + new Date().getTime()
    return config
  },
  err => {
    Loading.close()
    return Promise.reject(err)
  }
)

// http response 拦截器
axios.interceptors.response.use(
  response =>
    new Promise(resolve => {
      // 在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除
      removePending(response.config)
      // 根据接口定义结构判断是否请求成功
      if (!response.data.success) {
        Modal.warning({
          title: '提示',
          content: response.data.describe,
          centered: true,
          okText: '确定',
          onOk: () => {
            history.replace({ pathname: '/' })
          }
        })
      }
      Loading.close()
      resolve(response)
    }),
  error => {
    Loading.close()
    // TODO 此处可增加异常码拦截跳转
    if (error.response) {
      switch (error.response.status) {
        case 404:
          // TODO
          break
        case 500:
          // TODO
          break
        // ......
        default:
      }
    } else if (error.message === 'Network Error') {
      Modal.error({
        title: '提示',
        content: error.message + ' 请确认网络连接是否正常!',
        okText: '再试一次',
        onOk: () => {
          window.location.reload()
        }
      })
    }
    return Promise.reject(error)
  }
)

export default axios

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值