问题
有时候需要拦截或中止用户的某一次请求
-
用户的多次频繁提交,我们应该进行一定的限制。例如新建(create)
-
输入框联想查询,对频繁输入的查询请求进行一定限制
-
异步请求返回结果时序问题。比如先请求一次大数据,再请求一次小数据,我们需要的是第二次的数据,但由于第一次返回较慢,页面最终可能呈现的是第一次请求的数据
处理方式
中止请求(Abort)
案例:jira问题查询。每次触发查询时,中止上一次查询
可使用AbortController(developer.mozilla.org/zh-CN/docs/…) 来中止某一次请求
axios: <axios.nodejs.cn/docs/cancel…>
这种方式让用户每一次操作,请求都给实打实的发送出去了,不会影响到用户体验
但服务端每次都进行了处理,没有给服务端减轻压力
防抖(Debouncing)
案例:输入框搜索。输入结束等待一会才触发搜索查询
防抖可以只触发最终一次动作,但会导致查询延迟,等待的时间也不太好确定
输入搜索还有一些其他优化方法,比如只有键盘弹起时触发查询,按下不触发
节流(Throttling)
案例:jira创建问题。点击新建按钮提交,按钮会置灰不可点击并附带loading,等待请求结果返回后可再次点击
节流可以让请求立即执行,之后一段时间(或请求结果返回前)禁用,等待过后可以再继续操作
结论
用户体验 | 减轻服务端压力 | 可控性 | |
---|---|---|---|
中止请求 | A | B | B |
防抖 | C | A | C |
节流 | B | A | A |
根据具体情况使用适合的方法,个人推荐查询类操作可先试试中止请求,提交类操作试试节流
延伸
如何在全局处理呢?
哪些场景需要处理?