跳到主要内容

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

ParameterTypeDescription
changesT[]原始变更列表(会自动按 id 排序)
actionsSwitchVersionActions-

Returns

SwitchVersionActions

压缩后的操作集合

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 判断是否需要通知服务器