installWorkingTreeCapture()
function installWorkingTreeCapture(target, hook): RawWritePrimitives;
Defined in: packages/rxdb/src/capture/capture-interceptor.ts:251
在一个本地适配器实例上装好四个捕获挂载点
Parameters
| Parameter | Type | Description |
|---|---|---|
target | WorkingTreeCaptureMountTarget | 适配器实例 |
hook | WorkingTreeCaptureHook | 接管四个挂载点的捕获运行时 |
Returns
未经拦截的五个写原语;交给捕获运行时的 WorkingTreeCaptureHook.bindMountTarget
Remarks
安装时机是「装钩子的那一刻」,不是构造函数。 构造函数里装会被子类的类字段覆盖回去——
类字段的赋值排在 super() 之后,transaction = vi.fn() 这种写法会把刚装好的包装整个冲掉,
而且此刻 this.transaction 本身还是 undefined,连原语都绑不到。装在钩子到位时,对象
已经构造完毕,两个问题一起消失。
五个包装都是 function 而不是箭头函数。 事务内的调用经 executor 门面到达同一个实例
(adapter.mergeChanges.call(facade, …)),this 就是「这次写该落在哪个事务里」的全部信息。
箭头函数把它丢掉,于是事务内的合并会被当成事务外的合并去排队——而队列唯一的槽位正被本事务
占着,表现为永久挂起而不是报错。
upsertMany / deleteByIds 的包装是同步转发,中间没有 async:包成 async 会把同步
抛出的拒绝变成 rejected promise,而 adapter-contract.md §1.1 要的正是「调用方手里没有
Observable 可以订阅」。
Example
setWorkingTreeCaptureHook(hook: WorkingTreeCaptureHook): void {
hook.bindMountTarget(this, installWorkingTreeCapture(this, hook));
}