多重调度或嵌套调度
Multi dispatching or nested dispatching
我的商店有两个字段:
items: Item[]
money: number
当用户购买商品时 我调用 apiService 如果服务器的响应允许您添加商品(服务器将检查用户是否有足够的钱)我可以在我的商店中进行两项更改:
- 将新项目推送到数组
- 减少钱
我对什么是调度操作的良好做法感到困惑...
哪种方式最好?
- 多调度 - 调度
AddItem
操作和 DecreaseMoney
操作:
store.dispatch([new AddItem(), new DecreaseMoney()]);
- 订阅
AddItem
操作并在第一次成功时发送 DecreaseMoney
操作:
this.actions$.pipe(ofActionSuccessful(AddItem)).subscribe(() => {store.dispatch(new DecreaseMoney()});
- 在
AddItem
动作中调度 DecreaseMoney
动作:
@Action(AddItemAction)
AddItem({ getState, setState }: StateContext<any>) {
const state = getState();
return this.http.post(`${apiUrl}/buy`, {}).pipe(
tap(newItem => {
setState({...state, items: [...state.items, newItem]});
dispatch(new DecreaseMoney()); // <---
})
);
}
如果操作不会改变同一块状态,我建议使用多分派,因为它不那么冗长。如果您依赖第一个异步操作返回的响应,我认为您的嵌套设置是合乎逻辑的。但是,您似乎没有将任何内容传递给 DecreaseMoney()...所以第一个选项似乎是最好的。
编辑:
我会选择选项 2,因为这可能是一个特定的场景。如果您将所有逻辑都放在您的操作中,那么您就是将 DecreaseMoney() 耦合到 AddItem()。通过将业务逻辑放在 component/container 中,您可以创建可重用的操作。这就是我个人会做的。
我的商店有两个字段:
items: Item[]
money: number
当用户购买商品时 我调用 apiService 如果服务器的响应允许您添加商品(服务器将检查用户是否有足够的钱)我可以在我的商店中进行两项更改:
- 将新项目推送到数组
- 减少钱
我对什么是调度操作的良好做法感到困惑... 哪种方式最好?
- 多调度 - 调度
AddItem
操作和DecreaseMoney
操作:
store.dispatch([new AddItem(), new DecreaseMoney()]);
- 订阅
AddItem
操作并在第一次成功时发送DecreaseMoney
操作:
this.actions$.pipe(ofActionSuccessful(AddItem)).subscribe(() => {store.dispatch(new DecreaseMoney()});
- 在
AddItem
动作中调度DecreaseMoney
动作:
@Action(AddItemAction)
AddItem({ getState, setState }: StateContext<any>) {
const state = getState();
return this.http.post(`${apiUrl}/buy`, {}).pipe(
tap(newItem => {
setState({...state, items: [...state.items, newItem]});
dispatch(new DecreaseMoney()); // <---
})
);
}
如果操作不会改变同一块状态,我建议使用多分派,因为它不那么冗长。如果您依赖第一个异步操作返回的响应,我认为您的嵌套设置是合乎逻辑的。但是,您似乎没有将任何内容传递给 DecreaseMoney()...所以第一个选项似乎是最好的。
编辑:
我会选择选项 2,因为这可能是一个特定的场景。如果您将所有逻辑都放在您的操作中,那么您就是将 DecreaseMoney() 耦合到 AddItem()。通过将业务逻辑放在 component/container 中,您可以创建可重用的操作。这就是我个人会做的。