vue跳转路由前清空之前所有请求?

发布于 2022-09-07 20:55:23 字数 322 浏览 7 评论 0

如题,项目是vue-cli单页面应用,所以即使在跳转路由,上一个页面的请求也不会停止,这样会产生一系列问题。。。
在axios的官方文档发现了取消请求的方法,于是我就动手在我封装的axios里面试了试,没有成功,求指教

如图:我在base.js里创建了axios的实例,并且配置了canceltoken

clipboard.png

问:我现在想要在每次跳转路由前调用cancel方法应该怎么弄(我的beforeEach在main.js中)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

乱世争霸 2022-09-14 20:55:23

在每个组件的beforeDestoy生命周期中执行噶

深爱成瘾 2022-09-14 20:55:23

模式错了,不应该这样的。你可以写一个mixin

beforeDestory() {
  this.cancel() // 在组件内
}
泅人 2022-09-14 20:55:23

beforeRouteLeave
将所有的当前请求组织一个list放在this里,然后在离开路由的时候cancel即可

爱她像谁 2022-09-14 20:55:23

难点就是怎么在组件里拿到cancel,
那就利用函数的形参是对象的话,函数内部改变对象属性会影响到实参,
这样的话 在base里面改变对象之后,组件调用api时传过去的对象也会被改变,

我有做过类似的,但是我看你封装的axios跟我的不大一样,而且也看不出你是怎么使用instance的,我就把我的思路告诉你把

页面组件调用的地方:

this.$api.getInfo(params, this.cancel)    //    cancel = {}

接口:

getInfo(params, cancel) {
    return base(params, cancel)    
}

base:
拿到cancel这个对象,然后给这个空对象添加一个属性cancel,值是可终止请求的函数体
省略了很多,只有个大致思路

export const base = (params, cancel,.....) => {
    let config = {....}
    config.cancelToken = new CancelToken(function executor(c) {
      cancel.cancel = c;
    })
    
    return axios(config)
}
又怨 2022-09-14 20:55:23

要取消请求的话,肯定要记录你当前的所有请求

// 添加请求拦截器
axios.interceptors.request.use(
    config => {
        // 记录该条请求,我用的是url,你可以用其他
        const url = config.url;
        // 把cancel放在axios.list[url]下面
        config.cancelToken = new axios.CancelToken(cancel => axios.list[url] = { cancel });
        return config;
    },
    error => Promise.reject(error)
);
//然后可以在其他地方,遍历axios.list,调用list里面的cancel就可以取消当前所有请求
for(let key in axios.list){
    axios.list[key].cancel();
    //顺手删除
    delete axios.list[key];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文