【问题标题】:Multi dispatching or nested dispatching多调度或嵌套调度
【发布时间】:2020-03-10 18:29:07
【问题描述】:

我的商店有两个字段:

  • items: Item[]
  • money: number

当用户购买物品时我调用apiService如果服务器的响应允许你添加一个物品(服务器会检查用户是否有足够的钱)我可以做两个我商店的变化

  1. 将新项目推入数组
  2. 减少金钱

我对调度操作的良好做法感到困惑...... 哪种方式最好?

  1. 多分派 - 分派AddItem 动作和DecreaseMoney 动作:
store.dispatch([new AddItem(), new DecreaseMoney()]);
  1. 订阅AddItem动作并在第一次成功时调度DecreaseMoney动作:
this.actions$.pipe(ofActionSuccessful(AddItem)).subscribe(() => {store.dispatch(new DecreaseMoney()});
  1. 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()); // <---
      })
    );
  }

【问题讨论】:

    标签: action ngxs


    【解决方案1】:

    如果动作不会改变相同的状态,我建议使用多调度,因为它不那么冗长。如果您依赖第一个异步操作的返回响应,我认为您的嵌套设置是合乎逻辑的。但是,您似乎没有向 DecreaseMoney() 传递任何内容...所以第一个选项似乎最好。

    编辑:

    我会选择选项 2,因为这可能是一个特定的场景。如果您将所有逻辑都放在您的操作中,您就是将 DecreaseMoney() 耦合到 AddItem()。通过将业务逻辑放在组件/容器中,您可以创建可重用的操作。这就是我个人会做的。

    【讨论】:

    • 我没有将任何东西传递给第二个行动,因为我知道要减少多少资金(来自 json 资产),但我不确定第一个行动是否会成功。要发送第二个动作,我必须确保服务器允许我购买该物品。
    • 我会选择选项 2,因为这可能是一个特定的场景。如果您将所有逻辑都放在您的操作中,您就是将 DecreaseMoney() 耦合到 AddItem()。通过将业务逻辑放在组件/容器中,您可以创建可重用的操作。这就是我个人会做的事情。
    • 感谢您的建议! :)
    • 没问题 :) 如果您认为合适,请标记为最佳答案。
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多