Rxjs NGXS连续触发效应

Rxjs NGXS连续触发效应,rxjs,ngxs,Rxjs,Ngxs,我正在尝试创建一个示例,也许我们可以从angular redux+redux observable切换到NGXS 我们确实有几种用法,它们根据一个动作开始运行,当其他事情发生时停止运行,我不确定应该如何处理它们。小场景: on connect=>侦听更改 断开连接时=>取消订阅 @Action(HeroRealtimeActions.Connect) heroChanged(ctx:StateContext){ 返回此.hubClient.heroChanged$().pipe( //点击(x=

我正在尝试创建一个示例,也许我们可以从angular redux+redux observable切换到NGXS

我们确实有几种用法,它们根据一个动作开始运行,当其他事情发生时停止运行,我不确定应该如何处理它们。小场景:

on connect=>侦听更改

断开连接时=>取消订阅

@Action(HeroRealtimeActions.Connect)
heroChanged(ctx:StateContext){
返回此.hubClient.heroChanged$().pipe(
//点击(x=>console.warn(“>>>>英雄已更改”,x)),
mergeMap(heromes=>ctx.dispatch(newheroactions.Update(hero)),
);
}
这就是我希望它工作的方式:

  • Connect
    完成,但不阻止它,例如返回可观察到的,它将不会完成(如上所述)
  • takeUntil
    on
    disconnect
  • 如果再次触发
    connect
    ,则取消/忽略,例如ala
    switchMap
以上工作良好,但我不想阻止连接

在redux observable中,我们使用以下内容:

action$=>action$.pipe(
类型(HeroRealtimeActions.connectSuccess),
switchMap(hubConnection=>this.hubClient.heroChanged$().pipe(
//做点什么。。。
takeUntil(action$.pipe(类型为HeroRealtimeActions.disconnectSuccess)),
ignoreElements(),
))
);
我想的另一个选择是手动使用
.subscribe()
使用
操作$
takeUntil
,但是需要为
开关映射
做些其他的事情-但是听起来会有点混乱


我可以很容易地得到一些半生不熟的工作,我更要求一个正确的方法来做它

,所以我相信最等效的,也是非常干净的是使用这里描述的
ActionHandler
。将上述内容更改如下:

actions$.pipe(
OFACTIONSUCCESS(HeroRealtimeActions.Connect),
switchMap(()=>this.hubClient.heroChanged$().pipe(
//点击(x=>console.warn(“>>>>英雄已更改”,x)),
mergeMap(hero=>store.dispatch(newheroactions.Update(hero)),
takeUntil(actions$.pipe(ofActionSuccessful(HeroRealtimeActions.Disconnect)),
)),
).subscribe();

因此,我认为最等效、也是最干净的方法是使用这里描述的
ActionHandler
。将上述内容更改如下:

actions$.pipe(
OFACTIONSUCCESS(HeroRealtimeActions.Connect),
switchMap(()=>this.hubClient.heroChanged$().pipe(
//点击(x=>console.warn(“>>>>英雄已更改”,x)),
mergeMap(hero=>store.dispatch(newheroactions.Update(hero)),
takeUntil(actions$.pipe(ofActionSuccessful(HeroRealtimeActions.Disconnect)),
)),
).subscribe();

似乎是连接操作的配置,将是一个永远不会完成的已调度操作:。如果再次发送该操作,会发生什么情况?你可以通过取消来解决这个问题,但是为什么它首先是一个动作呢?在我看来,使用动作之外的某种机制进行连接通常是一种更好的方法。我不确定你们的中心在做什么,也不确定你们的中心是为了什么,但对我来说,可观测的东西似乎是一个“中心”。看起来您的集线器应该只是原始的可观察对象。@Richard.Davenport集线器是信号器连接(websockets),但它们本质上只是js术语中的可观察对象。因此,在本例中,我希望使用我订阅的新更改更新状态。似乎您对连接操作所做的是一个永远不会完成的已调度操作:。如果再次发送该操作,会发生什么情况?你可以通过取消来解决这个问题,但是为什么它首先是一个动作呢?在我看来,使用动作之外的某种机制进行连接通常是一种更好的方法。我不确定你们的中心在做什么,也不确定你们的中心是为了什么,但对我来说,可观测的东西似乎是一个“中心”。看起来您的集线器应该只是原始的可观察对象。@Richard.Davenport集线器是信号器连接(websockets),但它们本质上只是js术语中的可观察对象。所以,在这种情况下,我想要用我订阅的新更改更新状态。是的,这是我对FireBase之类的东西所做的。无论何时使用基于websocket/push的系统,我都会在操作之外打开一个侦听器,让套接字分派适当的操作。是的,这就是我对FireBase之类的东西所做的。无论何时使用基于websocket/push的系统,我都会在操作之外打开一个侦听器,让套接字分派适当的操作。