跳到主要内容

SwitchBranchOptions

Defined in: packages/rxdb/src/rxdb-adapter.ts:135

adapter.switchBranch() 的参数

Remarks​

这个原语同时承担两件事:切换激活分支,以及批量套用 SwitchVersionActions(历史回放只要后者,省略 SwitchBranchOptions.branchId 即可让 actions 落在当前分支上)。两件事共用一个事务,这正是它不拆成两个方法的原因—— 拆开就会在两者之间留出一个没人守着的窗口。

Properties​

actions​

actions: SwitchVersionActions;

Defined in: packages/rxdb/src/rxdb-adapter.ts:154

本次切换要在同一个事务里套用的版本动作(撤销/重做的写回、redo 栈作废等)。

Remarks​

必填但可以为空动作集。与分支切换同事务是有意的:动作改的是变更日志的可见性, 而分支切换改的是触发器指向,两者分属两个事务时中间的写会被错标。


branchId?​

optional branchId?: string;

Defined in: packages/rxdb/src/rxdb-adapter.ts:145

目标分支 id。

Remarks​

省略表示「作用于当前激活分支」——由适配器在切换事务内部解析,激活分支保持不变。 历史子系统(redo 失效、undo/redo 回放)借本方法批量套用 SwitchVersionActions, 它们从不想改分支;若由调用方先查当前分支再传进来,两次 await 之间发生的真实切换会让这条 迟到的调用把 activated 与全部变更日志触发器倒回旧分支,之后的写入全被错标。


prepare​

prepare: (context) => Promise<void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:173

切换事务内的前置钩子:适配器在解析出目标分支之后、动第一行之前 await 它。

Parameters​

ParameterType
contextSwitchBranchPrepareContext

Returns​

Promise<void>

Remarks​

适配器一侧的义务:解析完 branchId、在删触发器/改 activated/套用 actions 之前调用, 每次切换恰好一次。抛出的东西原样上抛,由事务回滚——不要 catch,也不要「记下来稍后再说」。

调用方一侧的义务:必填。分支切换的前置条件(工作树是否干净、提交图是否可达损坏、 代际凭据是否过期)以前跑在另一个只读事务里,那个事务与这次切换之间的窗口没有任何东西守着: 校验说「干净」,窗口里的一次写让它变脏,切换照样完成。放进这里之后, 「校验通过」与「切换完成」不再是两件可以分开发生的事。

做成必填而不是 ?,与 RxDBSystemContribution 九个贡献点一个都不带 ? 是同一条理由: ? 让「不需要」与「忘了」变成同一种东西,而这里忘了的症状是切换照常成功、只是没校验过。 真的不需要校验的调用点(历史回放只借本方法批量套用 actions,从不改分支)写一个显式空实现, 那一行是一句「我确实不需要」。