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

时间:2019-09-26 12:28:38

标签: ngxs

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

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缓存“太多”,如果没有执行某些动作,它看起来很喜欢。实际上,订阅已由NGXS正确处理,但在我们看来,没有任何效果(“网络”标签中没有请求)。

在我们的情况下,可以消除.subscribe()调用。只有在我们需要等待动作完成的地方,分派之后的订阅才有意义。

2 个答案:

答案 0 :(得分:1)

我认为这在某种程度上是风格问题,但是我想(从我对NGXS的使用来看)这是最典型的:

请在派遣时执行此操作,并且只有在要执行一些后续操作时才能在此处订阅。

dummy = pd.DataFrame({"col1": ["a",'a','a','b','b','b','c','c'],"col2":['1','2','3','4','5','6','7','8'] }, index=list(range(8))) print(dummy) dummy['one_liner'] = dummy.groupby('col1').col2.shift().expanding().mean().reset_index(level=0, drop=True) dummy['two_liner'] = dummy.groupby('col1').col2.shift() dummy['two_liner'] = dummy.groupby('col1').two_liner.expanding().mean().reset_index(level=0, drop=True) print(dummy) --------------------------- here is result of first print statement: col1 col2 0 a 1 1 a 2 2 a 3 3 b 4 4 b 5 5 b 6 6 c 7 7 c 8 here is result of the second print: col1 col2 one_liner two_liner 0 a 1 NaN NaN 1 a 2 1.000000 1.0 2 a 3 1.500000 1.5 3 b 4 1.500000 NaN 4 b 5 2.333333 4.0 5 b 6 3.000000 4.5 6 c 7 3.000000 NaN 7 c 8 3.800000 7.0

在该状态下,使用选项1的方法将this.store.dispatch(new LoadCustomer(customerId));返回到NGXS框架,并让其处理订阅本身(请参见docs re:动作处理)。

答案 1 :(得分:0)

第一种方法,因为将只有一个订阅,并且源组件/服务将能够对此做出反应。订阅@Action意味着只要调用@Action处理的内容,就会创建新的订阅。