action - 多调度或嵌套调度
问题描述
我的商店有两个字段:
items: Item[]
money: number
当用户购买商品时,我调用 apiService并且如果服务器的响应允许您添加商品(服务器将检查用户是否有足够的钱),我可以在我的商店中进行两项更改:
- 将新项目推送到数组
- 减少金钱
我对调度动作的良好做法感到困惑...... 哪种方式最好?
- 多调度 - 调度
AddItem
动作和DecreaseMoney
动作:
store.dispatch([new AddItem(), new DecreaseMoney()]);
- 在 first 成功时订阅
AddItem
action 和 dispatch action:DecreaseMoney
this.actions$.pipe(ofActionSuccessful(AddItem)).subscribe(() => {store.dispatch(new DecreaseMoney()});
DecreaseMoney
动作内部的调度AddItem
动作:
@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()。通过将业务逻辑放在组件/容器中,您可以创建可重用的操作。这就是我个人会做的。
推荐阅读
- flutter - Flutter 提供程序错误:当继承的小部件更改时
- reactjs - 加载页面时 useEffect() 出现问题
- python - python csv拆分行值和新列
- twig - journal3(opencart 的模板)iframe 在哪里?我怎样才能改变它?
- php - curl 命令在本地或生产网站上运行的不同结果
- spring-mvc - 如何将输入中输入的值从 freemarker 模板获取到我的 Spring 控制器?
- excel - 在 Excel 电子表格中添加行时,冻结宏中的行以停止隐藏/取消隐藏移动
- windows - 从电脑复制时无法运行 Xcode 项目
- typescript - Typescript:基于属性值的属性类型
- css - 移动设备上的扩展图像,背景固定