axios 取消多次重复请求

使用axios取消重复请求的实现方法
这篇博客介绍了如何在前端开发中利用axios取消重复请求,主要涉及两种方式:AbortController和cancelToken。通过在请求拦截器中保存请求URL和取消函数,并在响应拦截器中删除相关key来实现。示例代码分别展示了在axios二次封装和具体组件中的应用。

思路:

1、在请求拦截的时候将当前request url 和 取消函数以key-value的形式保存下来,如果重复请求了就调用取消函数;

2、在响应拦截时将这个key删除

方式:

1、AbortController:从v0.22.0开始,axios支持以fetch API方式——AbortController取消请求,用此方式一定要注意axios的版本,v0.22.0以下失效

2、cancelToken:此 API 从 v0.22.0 开始已被弃用,不应在新项目中使用。不过我的axios当前版本v1.2.0,还可以使用cancelToken 

上代码:

axios的二次封装:  @/axios/index.js

import axios from 'axios'
import store from '@/store'
import { message } from 'ant-design-vue'

const CancelToken = axios.CancelToken

let pedding = {}

const service = axios.create({
  baseURL: '/',
  timeout: 60000,
})

service.interceptors.request.use(config => {
  config.headers['token'] = store.state.user.token

  // 在参数中加个isCancelToken,用来判断该接口是否需要做多次请求取消上一个请求的操作
  if (config.isCancelToken) {

    // 第一种 AbortController
    const controller = new AbortController();
    config['signal'] = controller.signal
    pedding[config.url + '&' + config.method] && pedding[config.url + '&' + config.method].abort()
    pedding[config.url + '&' + config.method] = controller

    // 第二种 CancelToken.source
    const source = CancelToken.source()
    config['cancelToken'] = source.token
    pedding[config.url + '&' + config.method] && pedding[config.url + '&' + config.method].cancel()
    pedding[config.url + '&' + config.method] = source

    // 第三种 CancelToken
    pedding[config.url + '&' + config.method] && pedding[config.url + '&' + config.method]()
    config['cancelToken'] = new CancelToken((c) => {
      pedding[config.url + '&' + config.method] = c
    })

  }

  return config
}, error => {
  return Promise.reject(error)
})

service.interceptors.response.use(response => {
  // 这里删除key
  pedding[response.config.url + '&' + response.config.method] && delete pedding[response.config.url + '&' + response.config.method]

  if (response.data.code == 200) {
    return response.data
  } else {
    message.error(response.data.msg)
    return Promise.reject(response.data)
  }
}, error => {
  return Promise.reject(error)
})

export default service

以上三种方式选一个就可以。

例子:

@/views/home.vue

<template>
  <div>
    <a-button>home</a-button>
    <router-link to="/about">跳转about</router-link>
    <a-input placeholder=""></a-input>
    <a-checkbox></a-checkbox>
  </div>
</template>

<script>
import { login } from '@/axios/api/home'
export default {
  setup() {
    login({timeRange: 'ONE_DAY'}).then(res => {
      console.log('第一次调用-success')
    }).catch((err) => {
      console.log('第一次调用-err')
    })
    setTimeout(() => {
      login({timeRange: 'ONE_DAY', num: 1}).then(res => {
        console.log('第二次调用-success')
      }).catch((err) => {
        console.log('第二次调用-err')
      })
    }, 200)
  }
}
</script>

<style lang="scss" scoped>
</style>

@/axios/api/home.js

import request from '@/axios'

export const login = (data) => {
  return request({
    url: '/dc/pc/heatMap',
    method: 'get',
    params: data,
    isCancelToken: true
  })
}

结果:

 

到此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值