vue路由跳转取消上个页面的异步请求

背景:我们经常会遇到当前页面未加载完毕时跳转路由或者返回操作, 但是通过network会发现, 若网络环境较差的情况下, 会一直pending, 切换路由后在network中添加新的请求但是正在pending的请求依然存在. 当我们在项目中做了一个上拉加载分页的时候会一直加载中, 用户等待不耐烦后可能会主动触发返回操作, 但是此刻即使用户触发返回操作, 加载分页的请求还是存在, 页面还是会一直提示加载中, 直到该请求加载成功或超时才肯罢休。最终给用户造成一些不必要的结果,同时也对web性能造成一定的影响。

那么如何解决这个问题呢,方法就是监听路由,在路由切换前将上个页面的请求取消。

第一步:

axios请求头设置

import axios from 'axios'
import { store } from './store'    // 引入vuex
 
axios.interceptors.request.use(
  config => {
    config.cancelToken = new axios.CancelToken(function (cancel) {
      store.commit('pushToken', {cancelToken: cancel})
    })
    return config
  }
)

第二步:

利用vuex,新建一个store.js,将取消方法cancel放到数组中,然后在路由守卫中把数组中存有的cancel方法都执行

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  state: {
    cancelTokenArr: [] // 取消请求token数组
  },
  mutations: {
    pushToken (state, payload) {
      state.cancelTokenArr.push(payload.cancelToken)
    },
    clearToken ({ cancelTokenArr }) {
      cancelTokenArr.forEach(item => {
        item('路由跳转取消请求')
      })
      cancelTokenArr = []
    }
  }
})

第三步:

监听路由

router.beforeEach(function (to, from, next) {
  store.commit('clearToken') // 取消请求
  next()
})

到此就可以解决路由跳转后上个页面的请求还在pending的状态啦

cancel.png
console.png

如果想去掉控制台的console.error


code.png
if (axios.isCancel(error)) { // 取消请求的情况下,终端Promise调用链
    return new Promise(() => {});
  } else {
    return Promise.reject(error);
  }

至此完美解决,亲测有效!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,258评论 1 23
  • SPA单页应用 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候受网...
    视觉派Pie阅读 11,921评论 1 55
  • 原文:https://zhuanlan.zhihu.com/p/27588422 本文由浅入深观摩vue-rout...
    PixelEyes阅读 864评论 0 1
  • 人到了一定年纪,便少了明月清风的诗意,和听风赏雨的深情,更多的是面对生活里的压力,和现实的残酷。即便如此,依然愿你...
    雪婷阅读 139评论 0 0
  • 周末,爸爸在做饭,我和妈妈在洗床单。阳光正好,饭菜飘香,屋里清新。 真好!
    诗水年华阅读 176评论 0 1