现象
openless-all/app/src/pages/Style.tsx 三个写操作都是"乐观更新 + await 后端",但失败时既没有回滚本地 state,也没有给用户任何错误提示:
| 函数 |
行号 |
模式 |
onPickDefault(mode) |
Style.tsx:33-37 |
setPrefs(next); await setDefaultPolishMode(mode); |
onToggleEnabled(mode) |
Style.tsx:39-47 |
setPrefs(next); await setStyleEnabled(mode, enabled); |
onMasterToggle() |
Style.tsx:61-73 |
setPrefs(next); await setSettings(next); |
完整链路(UI → IPC → Rust handler)
| 动作 |
IPC 包装 |
Rust handler |
| 切默认 |
setDefaultPolishMode src/lib/ipc.ts:267 → invokeOrMock('set_default_polish_mode', { mode }, …) |
commands.rs:644 set_default_polish_mode(…) |
| 启停某风格 |
setStyleEnabled src/lib/ipc.ts:271 → invokeOrMock('set_style_enabled', { mode, enabled }, …) |
commands.rs:654 set_style_enabled(…) |
| 总开关 |
setSettings src/lib/ipc.ts:142 → invokeOrMock('set_settings', { prefs }, …) |
commands.rs:116 set_settings(…) |
三个 handler 都返回 Result<_, String>,前端却没人接 Err。
失败路径
任意 IPC 调用 reject 时:
- 本地
prefs state 已经被 setPrefs(next) 更新成"假成功"的值
await reject 抛出 unhandled rejection
- 用户在 UI 看到的状态(蓝色勾选 / toggle 已打开)和
preferences.json 实际内容不一致
- 下次刷新页面 / 重启应用,本地 state 重置回真实磁盘状态,用户的"刚才点的那一下"被静默撤销
用户可见后果
- 切了默认风格,下次启动发现没切成功
- 启停某个风格,重启后又是旧状态
- 总开关切回去无感
- 都不知道是为什么
建议接受标准
不在范围
- 注释/实现不一致是 sibling issue,独立处理
- 不引入全局 toast 框架
- 后端 handler 不变
现象
openless-all/app/src/pages/Style.tsx三个写操作都是"乐观更新 + await 后端",但失败时既没有回滚本地 state,也没有给用户任何错误提示:onPickDefault(mode)Style.tsx:33-37setPrefs(next); await setDefaultPolishMode(mode);onToggleEnabled(mode)Style.tsx:39-47setPrefs(next); await setStyleEnabled(mode, enabled);onMasterToggle()Style.tsx:61-73setPrefs(next); await setSettings(next);完整链路(UI → IPC → Rust handler)
setDefaultPolishModesrc/lib/ipc.ts:267→invokeOrMock('set_default_polish_mode', { mode }, …)commands.rs:644set_default_polish_mode(…)setStyleEnabledsrc/lib/ipc.ts:271→invokeOrMock('set_style_enabled', { mode, enabled }, …)commands.rs:654set_style_enabled(…)setSettingssrc/lib/ipc.ts:142→invokeOrMock('set_settings', { prefs }, …)commands.rs:116set_settings(…)三个 handler 都返回
Result<_, String>,前端却没人接Err。失败路径
任意 IPC 调用 reject 时:
prefsstate 已经被setPrefs(next)更新成"假成功"的值awaitreject 抛出 unhandled rejectionpreferences.json实际内容不一致用户可见后果
建议接受标准
try/catch,失败时回滚本地 state(重新调getSettings()或保留前值)Err(String)不在范围