我不知道这是否只是样式问题。 至少有两种处理异步操作的方式:
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()
调用。只有在我们需要等待动作完成的地方,分派之后的订阅才有意义。
答案 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
处理的内容,就会创建新的订阅。