如何在前端客户多次点击不同的内容时,只加载最后一次点击的请求?

2020-09-11 21:15:05 +08:00
 skyfollow

首先,题主不是前端,但是现在遇到了一个前端问题,希望能在 V2EX 得到一些方向上的指导。

问题背景:我们是一个类似于 IM 的工具,在后台每个操作人员,可以看到很多客户,可以与其进行聊天。

点击一个客户,此时,右侧会去加载聊天内容以及该客户的其他信息,大约有产生四个接口请求。

现在遇到的问题时:如果操作人员,连续快速的点击多个客户,比如连续点击十个客户,此时就会前端积累大量未完成的请求,显得后面的加载非常卡。

现在希望,如果发生了连续多次点击,当点击到后面一个客户时,之前未加载完毕的请求全部停止加载,只加载当前的客户所需要的请求,这样资源,便可以集中在最有意义的最后一次点击上。

谢谢!

3125 次点击
所在节点    程序员
24 条回复
skiworld
2020-09-11 21:16:49 +08:00
你怎么判断他是最后一次点击的。
BryceGu
2020-09-11 21:18:41 +08:00
js 防抖了解一下
Blackhumor
2020-09-11 21:25:49 +08:00
节流( throttle )和防抖动( debounce ) 了解一下
px920906
2020-09-11 21:50:57 +08:00
巧了,之前项目遇到过同样的需求,楼主可以参考一下 -> https://onepixel.site/blog/2019/04/axios_cancel_repeated_requests/
在我看来防抖只是第一层,只要发出请求的间隔大于防抖的延迟就会发出多个请求,而网络不稳定时就可能会出现“先发出的请求”在“后发出的请求”之后完成的情况
VDimos
2020-09-11 21:55:09 +08:00
防抖
cyitao
2020-09-11 21:56:19 +08:00
这个场景适合防抖,防抖的原理是点击一个客户后不会立即请求,而是有一个 500 毫秒(可自定义)的延迟。在 500ms 内点击第 2 3 4 5 6 个客户时,会取消上一次点击的计时器,并设置新的请求计时器。直到 500ms 内无点击操作,才真正发出请求。
liberty1900
2020-09-11 22:05:13 +08:00
楼上没有回答核心问题,楼主说的是不同内容
Event Delegation 可解
azh7138m
2020-09-11 22:10:24 +08:00
意义并不大
支持 abort 操作需要较高的浏览器版本
https://developer.mozilla.org/en-US/docs/Web/API/AbortController
底层也不一定能真的 abort

还不如低成本搞个 debounce
wxsm
2020-09-11 22:15:08 +08:00
首先,停止加载是不现实的,因为请求一旦发出就不可撤回,你只能选择在前端忽略响应,但应该这不是你想要的。
因此,最佳方案就是 debounce,楼上什么 event delegate,我倒是希望你自圆其说。让我学习一下。
tanranran
2020-09-11 22:29:48 +08:00
rxjs
poisedflw
2020-09-11 22:54:15 +08:00
一个定时器就搞定了吧,点击左侧延迟 400ms 去请求数据,点击下一个人的时候清掉上一次的定时器,依次类推。
finalwave
2020-09-11 22:58:41 +08:00
axios 提供 cancel 的。自己写一个代理请求在回调的时候判断是否执行真回调的函数也行。
finalwave
2020-09-11 23:02:53 +08:00
啊,楼主要的是停止请求,那只能 debounce 和 abort 了
amundsen
2020-09-11 23:06:28 +08:00
使用著名的 js 库 lodash 中的防抖函数:debounce 或者节流函数:throttle 。
realpg
2020-09-12 01:27:18 +08:00
点击直接先反馈一个载入中 modal 等待返回异步处理后取消
不给客户瞎 J8 点的机会
rodrick
2020-09-12 11:13:11 +08:00
debounce 可解 但是实际上用户点击好几个客户是不是就是想要加载多个聊天窗口之类的 还是单纯的误操作
mczhanhong
2020-09-12 11:21:58 +08:00
可以考虑 rxjs 的 switchmap
ccraohng
2020-09-12 12:50:52 +08:00
优先队列,后面的优先级别最高。
skyfollow
2020-09-12 14:07:34 +08:00
@skiworld 你好,不能判断。所以策略是,希望下一次点击发生时,之前的请求全部能够停止继续请求。
KuroNekoFan
2020-09-12 14:37:22 +08:00
每次点击保存一个 click-id,然后处理请求结果的时候对比事件处理闭包的 click-id 和 ui 组件保存的 click-id,不一样则抛弃

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706278

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX