处理重复请求

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()判断当前请求是否是主动取消的

以上是关于处理重复请求的主要内容,如果未能解决你的问题,请参考以下文章

中小型项目统一处理请求重复提交

关于VUE中按钮重复点击,重复请求的处理

处理多个并发请求 Express [重复]

后端处理高并发状态的多次重复请求

如何在 Express 请求处理程序中编写非阻塞异步函数 [重复]

如何在 Express 请求处理程序中编写非阻塞异步函数 [重复]