NGXS连续触发效果

  • 本文关键字:连续 NGXS rxjs ngxs
  • 更新时间 :
  • 英文 :


我试图创建一个样本,也许我们从角度冗余+冗余可观察切换到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完成并且不阻止它,例如返回可观察它不会完成(如上所述(
  • takeUntildisconnect
  • 如果再次触发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();

最新更新