当前位置:网站首页 > Vue.js开发 > 正文

vue项目路由跳转后上一页面未完成的接口取消

一,概述

需要做到的是a页面发送请求,在还没有收到响应时,用户跳转B页面,这时候取消a页面的请求.

二,实现

axios提供了这个方法,我是结合axios和vuex以及vue-router实现的.
主要的思路如下:
在axios的请求拦截器中收集所有发送的接口,存储在vuex的一个数组中,然后在router.beforeEach中监听到路由跳转,就把该数组中的所有未完成的请求取消.

第一步:

在axios的请求拦截器中收集发送的请求,调用store的方法:

 // 创建axios实例 const service = axios.create({ 
    // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: process.env.VUE_APP_baseUrl, //除非 url 是绝对的,否则 baseURL 将会被加在 url 前面。 }); // request拦截器 service.interceptors.request.use( async config => { 
    config.cancelToken = new axios.CancelToken(function (cancel) { 
    store.commit('pushToken', { 
    cancelToken: cancel }); }); } }) 

第二步:

在store中创建添加请求到数组中,和把数组中请求清空的方法:

import { 
    createStore } from 'vuex'; const store = createStore({ 
    state: { 
    cancelTokenArr: [] // 取消请求token数组 }, getters: { 
   }, actions: { 
   }, mutations: { 
    pushToken(state, payload) { 
    state.cancelTokenArr.push(payload.cancelToken); }, clearToken({ 
     cancelTokenArr }) { 
    cancelTokenArr.forEach(item => { 
    item('路由跳转取消请求'); }); cancelTokenArr = []; } }, }); export default store; 

第三步:

在router.beforeEach中监听路由跳转,执行清空数组中未收到响应的请求.

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

第四步:

因为被取消的请求,会走axios的响应拦截器的fail回调函数,于是为了避免控制台报错,可以在这里处理掉这个报错:

 // 响应拦截器 service.interceptors.response.use( res => { 
    resolve(res.data); }, error => { 
    if (axios.isCancel(error)) { 
    // 取消请求的情况下,终端Promise调用链 return new Promise(() => { 
   }); } else { 
    reject(error) } } ); 
到此这篇vue项目路由跳转后上一页面未完成的接口取消的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • vue中配置axios教程-定稿版(三)——页面index.vue中引入和使用接口文件,network查看请求和响应2024-12-02 23:27:06
  • 配置项目(一)——vue.config.js2024-12-02 23:27:06
  • vue中配置axios教程-定稿版(一)——api index.js配置文件和.env文件2024-12-02 23:27:06
  • vue自定义指令2024-12-02 23:27:06
  • VUE中,el-select选择器多选下拉框实现全选功能和取消全选2024-12-02 23:27:06
  • vue-template-admin的keep-alive缓存与移除缓存2024-12-02 23:27:06
  • vue3下watch的使用2024-12-02 23:27:06
  • vue3中获取dom元素和操作2024-12-02 23:27:06
  • vue项目中配置eslint和prettier2024-12-02 23:27:06
  • 基于vue2.x搭建组件库的流程-(五 )-二次封装dialog组件2024-12-02 23:27:06
  • 全屏图片