NgRx-减速器的优先级和针对商店的执行顺序

时间:2018-06-30 21:34:41

标签: javascript angular redux ngrx

如果不同的化简器与同一动作相关联并且正在对商店进行更改,那么在进行任何编辑之前,它们是否收到了相同的版本?有优先考虑的地方吗?

示例:

让我们假设您在服务器端分派了一个动作Update以编辑实体,一旦数据成功更新,一个效果将分派一个Update_Success动作,该实体的新接收版本为有效载荷。第一个经典的逻辑化约简器将使用它来更新商店:

case ItemActionTypes.UPDATE_ITEM_SUCCESS: {
    const item = action.payload;

    return {
    ...adapter.upsertOne(item, state),
    loaded: true,
    loading: false
    };
}

现在让我们假设在另一个文件中,您具有与同一操作关联的另一个化简器,并且需要将新接收的实体与商店中的旧实体进行比较:

case ItemActionTypes.UPDATE_ITEM_SUCCESS: {
    const item = action.payload;
    const oldItem = state.entities[item.id];
    const changes = getAffectedProperties(item, oldItem);

    // ...
}

问题是oldItem实际上有可能保存了新收到的物品,而不是旧物品,因为第一个减速器可能已经更新了它?这是先到先得案例吗?还是在实现上有什么保证所有的reducer对同一版本的商店进行更改,并可能将这些更改进一步合并?

1 个答案:

答案 0 :(得分:1)

  

如果不同的化合器与相同的动作相关联并且是   对商店进行更改,他们是否收到相同的版本   进行任何编辑之前?有优先考虑的地方吗?

减速器只能访问其状态。因此,您不应该真正在意这一点。

此外,当分派一个动作时,所有减速器都以同步方式调用。这意味着,如果您要为ACTION_A从不同的地方(/不同的缩减器)修改商店,那么选择器(甚至视图)将仅刷新一次。当该操作的所有更新都应用到商店时。