谁应该订阅 NGXS 异步操作——调度操作调用者或@Action 处理程序?

Who should subscribe to NGXS async action - the dispatch action caller or the @Action handler?

我不知道这是否只是风格问题。 至少有两种处理异步操作的方法:

dispatch

之后订阅
// action is being dispatched and subscribed
this.store.dispatch(new LoadCustomer(customerId)).subscribe(); // <-- subscribe

在州内:

@Action(LoadCustomer)
loadCustomer(context: StateContext<CustomerStateModel>,
             customerId: string) {
  return this.customerService.loadById(customerId).pipe(
    tap(c => context.setState(produce(context.getState(), draft => {
      draft.byId[customerId] = c;
    })))
  ); // <-- NO subscribe here, just return the Observable
}

订阅 @Action 处理程序

// action is being dispatched
this.store.dispatch(new LoadCustomer(customerId)); // <-- no subscribe

在州内:

@Action(LoadCustomer)
loadCustomer(context: StateContext<CustomerStateModel>,
             customerId: string) {
  this.customerService.loadById(customerId).pipe(
    tap(c => context.setState(produce(context.getState(), draft => {
      draft.byId[customerId] = c;
    })))
  ).subscribe(); // <-- subscribe is done in action handler
}

问题

哪个更好,为什么?

编辑/提示

原来导致这个问题的核心问题是: 我们有一个 HttpInterceptor 缓存 "too much",如果没有执行某些操作,它看起来很不错。事实上,NGXS 已经正确处理了订阅,但在我们的例子中没有看到任何效果(网络选项卡中没有请求)。

在我们的案例中,可以消除 .subscribe() 调用。只有在我们需要等待操作完成的地方,调度后的订阅才有意义。

方法一,因为只有一个订阅,源 component/service 将能够对其做出反应。在 @Action 中订阅意味着每当调用 @Action handled 时都会创建新的订阅。

我认为这有点风格问题,但我会说(根据我对 NGXS 的使用)这是最典型的:

在派遣时执行此操作,并且只有在您想要执行某些 post 操作时才在此处订阅。

this.store.dispatch(new LoadCustomer(customerId));

并且在状态下,选项 1 方法,return Observable 到 NGXS 框架并让它自己处理订阅(参见 docs re: action处理)。