谁应该订阅 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处理)。
我不知道这是否只是风格问题。 至少有两种处理异步操作的方法:
在 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处理)。