axios取消请求,axios取消请求发送

http://www.itjxue.com  2023-01-22 04:44  来源:未知  点击次数: 

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

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

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

第一步:

axios请求头设置

第二步:

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

第三步:

监听路由

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

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

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

处理重复请求

在我们的日常开发当中,很多时候会出现短时间内接口重复请求的情况,如果没有妥当地处理,很可能会造成以下的影响:

以一定的频率发送请求,即在特定时间内只允许发送一次请求:

适用于频繁触发并且需要给予用户一些反馈的场景,如:resize、scroll、mousemove

间隔时间大于指定时间才发送请求:

方案1,2 时间间隔不好把控,并且因为会丢失掉部分请求,因此只能针对get请求;

方案3看起来最笨,等待时间长,请求未减少,但因为他将请求排成了一个队列,所以可以避免post请求导致数据数据絮乱的情况;

方案4的请求未减少,并且实际上也无法控制该请求是否已经到达服务器,但该方案保证了在前端不执行无效的响应回调;

根据项目的实际情况,我最终选择了方案4,而该方案刚好可以通过axios的 cancelToken来实现。

设置一个列表pendingList,用于存储当前处于pending的请求,在每个请求发送之前,先判断当前请求是否已经存在于pendingList中。若存在,则说明该请求已被请求过,造成了重复请求,这时候则需要把重复的请求cancel,再把新请求添加到pendingList中。若不存在,则说明这个请求是干净的,可进行正常请求,同时也需要把这个请求添加到pendingList中,在请求结束后再把该请求从pendingList中移除。

其中,我们可以通过axios cancelToken来取消请求

axios提供了两种方法来取消请求

设置一个列表pendingList,用于存储当前处于pending的请求

提供getFetchKey方法,用于生成各个请求的标识,当为GET请求时,因为只用于获取数据,因此只要当method和url都一致时,我们就可以认为这是同一请求,而其他请求则还需要加上请求的参数。

添加请求到pendingList

把请求从pendingList移除

把请求从pendingList移除并取消该请求

在拦截器中添加以上方法

最后,因取消请求抛出的error我们不应该返回给用户,使用axios.isCancel()判断当前请求是否是主动取消的

React - 实现fetch取消、中止请求

项目开发过程中有时会遇到这种情况:两次查询请求相隔时间很短时,由于 接口异步 ,第一次请求可能会覆盖第二次请求返回数据,所以需要在第二次请求前先将第一次请求中止,话不多说,实现如下:

关于axios取消请求网上有很多,可自信百度,本文主要针对于fetch请求,由于fetch并没有 "取消请求" 方法,目前通过AbortController()实现

项目:Ant.Design Pro + umijs + dva

新建一个abortDispath.js文件

新建一个扩展Component

demo.js

request.js 文件中需要将signal放在options中,例如

(责任编辑:IT教学网)

更多

相关微软认证文章

推荐微软认证文章