前端如何拦截重复的、无效的请求

115 阅读2分钟

问题

有时候需要拦截或中止用户的某一次请求

  • 用户的多次频繁提交,我们应该进行一定的限制。例如新建(create)

  • 输入框联想查询,对频繁输入的查询请求进行一定限制

  • 异步请求返回结果时序问题。比如先请求一次大数据,再请求一次小数据,我们需要的是第二次的数据,但由于第一次返回较慢,页面最终可能呈现的是第一次请求的数据

image.png

处理方式

中止请求(Abort)

案例:jira问题查询。每次触发查询时,中止上一次查询

可使用AbortController(developer.mozilla.org/zh-CN/docs/…) 来中止某一次请求

axios: <axios.nodejs.cn/docs/cancel…>

这种方式让用户每一次操作,请求都给实打实的发送出去了,不会影响到用户体验

但服务端每次都进行了处理,没有给服务端减轻压力

防抖(Debouncing)

案例:输入框搜索。输入结束等待一会才触发搜索查询

防抖可以只触发最终一次动作,但会导致查询延迟,等待的时间也不太好确定

输入搜索还有一些其他优化方法,比如只有键盘弹起时触发查询,按下不触发

节流(Throttling)

案例:jira创建问题。点击新建按钮提交,按钮会置灰不可点击并附带loading,等待请求结果返回后可再次点击

节流可以让请求立即执行,之后一段时间(或请求结果返回前)禁用,等待过后可以再继续操作

结论

用户体验减轻服务端压力可控性
中止请求ABB
防抖CAC
节流BAA

根据具体情况使用适合的方法,个人推荐查询类操作可先试试中止请求,提交类操作试试节流

延伸

如何在全局处理呢?

哪些场景需要处理?