我试图创建一个样本,也许我们从角度冗余+冗余可观察切换到NGXS。
我们确实有几种用法,它们根据操作开始运行,并在运行其他事情时停止,我不是 100% 确定应该如何处理它们。小场景:
连接 => 听英雄更改
断开连接时 =>取消订阅
@Action(HeroRealtimeActions.Connect)
heroChanged(ctx: StateContext<HeroRealtimeStateModel>) {
return this.hubClient.heroChanged$().pipe(
// tap(x => console.warn(">>>> hero changed", x)),
mergeMap(heroes => ctx.dispatch(new HeroActions.Update(hero))),
);
}
这就是我希望它的工作方式:
Connect
完成并且不阻止它,例如返回可观察它不会完成(如上所述(takeUntil
disconnect
- 如果再次触发
connect
则取消/忽略,例如 alaswitchMap
以上效果很好,但我不想阻止连接。
在 redux-observable 中,我们曾经有如下的东西:
action$ => action$.pipe(
ofType(HeroRealtimeActions.connectSuccess),
switchMap(hubConnection => this.hubClient.heroChanged$().pipe(
// do something...
takeUntil(action$.pipe(ofType(HeroRealtimeActions.disconnectSuccess))),
ignoreElements(),
))
);
我想的另一个选择是使用手动.subscribe()
使用actions$
来takeUntil
,但需要其他东西来switchMap
- 但听起来它会变得有点混乱
我可以很容易地得到一些半生不熟的东西,我更要求一种正确的方法
所以我相信最等效的,也是相当干净的,是使用 https://www.ngxs.io/advanced/action-handlers 这里描述的ActionHandlers
。将上述内容更改如下:
actions$.pipe(
ofActionSuccessful(HeroRealtimeActions.Connect),
switchMap(() => this.hubClient.heroChanged$().pipe(
// tap(x => console.warn(">>>> hero changed", x)),
mergeMap(hero => store.dispatch(new HeroActions.Update(hero))),
takeUntil(actions$.pipe(ofActionSuccessful(HeroRealtimeActions.Disconnect))),
)),
).subscribe();