[RFC] 049 - 乐观更新改造 #2710
arvinxx
started this conversation in
RFC | 特性开发
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
背景
在做 #1851 的实施过程中发现, 在 client DB 请求响应非常敏捷的情况下(~ 30ms),大量中间态都被忽略了。而换成 serverDB 后,网络请求的延迟变得不可忽略(300ms ~ 2s)。因此需要对应适配服务端操作的逻辑,才能确保体验优良。
对应的适配策略有两个,一个是加 loading 态,另外一个就是乐观更新。
简介:什么是乐观更新
乐观更新(Optimistic UI Update)是一种在前端开发中常用的技术策略,用于提升应用程序的用户体验。当应用程序需要与服务器进行数据交互时,乐观更新策略假设这些交互会成功,并立即在用户界面上反映这些变更,而不是等待服务器响应。这种方法可以使应用感觉更快,因为它减少了用户等待服务器响应的时间。
乐观更新的工作原理:
使用乐观更新的优点:
使用乐观更新的缺点:
应用场景:
乐观更新特别适用于那些对实时性要求较高的应用,如在线协作工具、社交网络应用等。在这些应用中,快速响应用户操作并保持界面流畅是非常重要的。
总之,乐观更新是一种有效的前端策略,可以显著提高应用的响应性和用户满意度,但同时它也要求开发者在实现时仔织考虑错误处理和数据一致性问题。
设计思路
基本 case
乐观更新主要存在用户操作层面,例如 增删改等操作,核心需要做的事情就是采用前端状态先行变更, 然后再派发请求。以 userStore 的
updatePreference
为例,实现如下:如果存在更新失败的场景,还需要 try catch await 做对应的状态回滚,但限于工作量问题,本次暂时先不做,后续再补上。
数据展示类变更
如果是针对展示类数据的变更,往往还需要 loading 态并搭配一次 refresh 数据。以 topic 为例:
表单类
针对表单类输入的场景,常见的做法是加一个确认按钮,但是我们期望尽可能做成实时的效果,因此仍然采用 clientDB 模式下那种变更后就触发更新的模式。而这种情况下就会出现比较严重的请求竞态问题。 比较典型的情况就是用户输入完毕 'abcdefg',等待一会结果变成了 'abc' 。
而解决方案就是发起新的请求时自动取消上一个更新请求,始终确保用户最后的操作是最终的更新请求。
Important
可能有人会问为何不用 useSWR 内置的乐观更新能力,原因是 useSWR 对于数据的定制能力实在有限,而我们的场景由于交互复杂度的关系,存在大量的自定义数据控制流,因此不可行。(比如上述表单类的竞态控制就做不到)
进展
Beta Was this translation helpful? Give feedback.
All reactions