compactChanges()
function compactChanges<T>(changes, actions?): SwitchVersionActions;
Defined in: packages/rxdb/src/version/compact-changes.ts:46
压缩变更列表为 SwitchVersionActions(专用于 Push 场景)
使用状态机逻辑处理变更压缩,针对 Push 场景特化:
- 本地新建后删除的数据(INSERT → DELETE 且 inversePatch 为 null)不需要 push
- 远程已有数据的删除(inversePatch 不为 null)必须 push DELETE
Type Parameters
| Type Parameter |
|---|
T extends IRxDBChange |
Parameters
| Parameter | Type | Description |
|---|---|---|
changes | T[] | 原始变更列表(会自动按 id 排序) |
actions | SwitchVersionActions | - |
Returns
压缩后的操作集合
Example
// 场景1:本地新建后删除(不需要 push)
const changes1 = [
{ type: 'INSERT', entityId: '1', patch: { name: 'Alice' }, inversePatch: null },
{ type: 'DELETE', entityId: '1', patch: null, inversePatch: null }
];
const actions1 = compactChanges(changes1);
// actions1.deletes.size === 0(本地数据,服务器从未见过,不需要通知删除)
// 场景2:远程数据被删除(必须 push DELETE)
const changes2 = [
{ type: 'UPDATE', entityId: '1', patch: { name: 'Bob' }, inversePatch: { name: 'Alice' } },
{ type: 'DELETE', entityId: '1', patch: null, inversePatch: { name: 'Bob' } }
];
const actions2 = compactChanges(changes2);
// actions2.deletes.size === 1(服务器有这条数据,必须通知删除)
Remarks
压缩规则(Push 专用):
INSERT → DELETE+inversePatch === null→ 抵消(本地新建,服务器从未见过)INSERT → DELETE+inversePatch !== null→ 保留 DELETE(服务器已有旧数据)INSERT → UPDATE*→ 合并为 INSERT(一次性插入最终状态)UPDATE → UPDATE*→ 合并为 UPDATE(合并所有 patch)UPDATE → DELETE→ 保留 DELETE(服务器必须知道数据被删除)
与 get_switch_version_actions 的区别:
get_switch_version_actions:分支切换场景,INSERT → DELETE完全抵消compactChanges:Push 场景,基于inversePatch判断是否需要通知服务器