axios使用-页面切换时清除上个页面所有未完成的请求

本文介绍了如何在Vue应用中利用AbortController来取消axios请求,以防止页面切换时未完成请求的影响。在每个请求时创建新的AbortController实例,并将其存储在Vuex中。当路由切换时,遍历并终止所有请求,确保上个页面的请求被清理,保持应用的高效运行。此外,还提及了已被废弃的CancelToken方法作为对比。

取消请求/Cancellation

需求:页面切换时清除上个页面所有未完成的请求

AbortController-推荐

v0.22.0开始支持,用于取消请求

1.为每个请求设置signal字段值,且把controller存储到vuex中

import axios from "axios"
import store from "../store"
const instance = axios.create({
  ...
})
instance.interceptors.request.use(
  req => {
    const controller = new AbortController() // 每个请求时都新生成一个AbortController实例
    req.signal = controller.signal // 设置请求的signal字段为new AbortController()的signal
    store.commit("addRequest", controller)
    ...
    return req
  },
  error => error
)

2.store中代码,存储每个controller,用于调用每个controller的abort方法来取消请求

import { createStore } from "vuex"
export default createStore({
  state() {
    return {
     requests: []
    }
  },
  mutations: {
    addRequest(state,controller) {
      state.requests.push(controller)
    }
  }
})

3.路由拦截器beforeEach里做处理,每次页面切换时就清除上个页面的所有请求

router.beforeEach((to, from, next) => {
  ...
  store.state.requests.forEach(controller => controller.abort()) // 通过遍历终止所有未完成的请求
  store.state.requests = [] // 执行完清空,从而不影响新页面的请求列表
  next()
})

CancelToken -废弃(deprecated)

v0.22.0开始废弃,虽然你还可以正常使用,但是不应该在新项目中使用

1.为每个请求设置cancelToken字段值,且把source存储到vuex中

import axios from "axios"
import store from "../store"
const instance = axios.create({
  ...
})
const CancelToken = axios.CancelToken // 生成终止请求的CancelToken对象
instance.interceptors.request.use(
  req => {
    const source = CancelToken.source() // 每个请求时都新生成一个source对象
    req.cancelToken = source.token // 设置cancelToken字段为source的token,用于source.cancel()清除
    store.commit("addRequest", source)
    ...
    return req
  },
  error => error
)

2.store中代码,存储每个source,用于调用每个source的cancel方法来取消请求

import { createStore } from "vuex"
export default createStore({
  state() {
    return {
     requests: []
    }
  },
  mutations: {
    addRequest(state,source) {
      state.requests.push(source)
    }
  }
})

3.路由拦截器beforeEach里做处理,每次页面切换时就清除上个页面的所有请求

router.beforeEach((to, from, next) => {
  ...
  store.state.requests.forEach(source => source.cancel()) // 通过遍历终止所有未完成的请求
  store.state.requests = [] // 执行完清空,从而不影响新页面的请求列表
  next()
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值