处理重复请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理重复请求相关的知识,希望对你有一定的参考价值。
参考技术A 在我们的日常开发当中,很多时候会出现短时间内接口重复请求的情况,如果没有妥当地处理,很可能会造成以下的影响:以一定的频率发送请求,即在特定时间内只允许发送一次请求:
适用于频繁触发并且需要给予用户一些反馈的场景,如: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()判断当前请求是否是主动取消的
以上是关于处理重复请求的主要内容,如果未能解决你的问题,请参考以下文章