C# 带信号器的RxJs或EventEmitter

C# 带信号器的RxJs或EventEmitter,c#,asp.net-mvc,angular,rxjs,signalr,C#,Asp.net Mvc,Angular,Rxjs,Signalr,在我基于ASP.NET MVC的Angular 8应用程序中,有一个仪表板组件,我在其中显示某种统计数据(例如总和、平均数),并在每次创建更新删除事件后,通过向所有客户端广播新数据,在SignalR的帮助下更新这些数据。另一方面,我想建立一种通用的方法,应该在整个应用程序中使用,我认为使用EventEmitter、BehaviorSubject、Subject、ReplaySubject等将新检索到的统计数据传递给客户端似乎是个好主意。但是这些组件之间有一些区别,如图所示,我想澄清一下哪一个最适

在我基于ASP.NET MVC的Angular 8应用程序中,有一个仪表板组件,我在其中显示某种统计数据(例如总和、平均数),并在每次创建更新删除事件后,通过向所有客户端广播新数据,在SignalR的帮助下更新这些数据。另一方面,我想建立一种通用的方法,应该在整个应用程序中使用,我认为使用EventEmitter、BehaviorSubject、Subject、ReplaySubject等将新检索到的统计数据传递给客户端似乎是个好主意。但是这些组件之间有一些区别,如图所示,我想澄清一下哪一个最适合给定的示例?为什么

请注意,我需要跨没有父子关系(通常在同级组件之间)的不同组件向客户端传递多个数据

这是我使用EventEmitter时的代码。但我认为行为主体可能更适合我的情况:

服务。ts:


在您的示例中,
EventEmitter
的使用在逻辑上是合理的,但是您必须避免对广播使用
EventEmitter
<代码>事件发射器应用于
@输出
属性。尽管根据当前的angular code,EventEmitter是从
主题派生的
,但是
EventEmitter
的实现可能会发生如上所述的变化

您应该根据需要使用
主题
/
行为主题

使用
Subject
,订阅者将获得订阅后发出的新值


使用
BehaviorSubject
subscriber将在订阅方订阅可观察值和所有未来发射值后立即获得最后发射值。

Perfect!。。现在我确定我需要根据我的情况使用Subject或Behavior Subject,非常感谢…根据我的情况(创建或删除后更新仪表板上的数据),哪一个最合适?关键点在于,当第一次打开仪表板页面时,可以从数据库中检索数据,并且在第一次加载时,不需要使用SignalR或nedd进行广播。这意味着不需要向客户端发送值。在这个场景中,我想我在订阅后会得到新的值,因此我应该使用Subject。这是真的吗?如果我可以在这个场景中使用BehaviorSubject,我认为最好使用它,因为它有一些优点。有什么帮助吗?@Jack我投票支持
BehaviorSubject
,因为它给出了订阅的一些初始状态。如果我不想处理初始值,我会应用rxjs操作符,比如
filter
@Injectable()  
export class SignalRService {  
  messageReceived = new EventEmitter<ChatMessage>();  
  connectionEstablished = new EventEmitter<Boolean>();

  constructor() {  
    this.registerOnServerEvents();  
    this.startConnection();  
  }

  private startConnection(): void {  
    this._hubConnection  
      .start()  
      .then(() => {  
        this.connectionEstablished.emit(true);  
      })
  }  

  private registerOnServerEvents(): void {  
    this._hubConnection.on('ReceiveMessage', (data: any) => {  
      this.messageReceived.emit(data);  
    });  
  }  
}  
export class ClockComponent { 

  constructor(private _signalRService: SignalRService, private _ngZone: NgZone) {  
      this.subscribeToEvents();
  }  

  private subscribeToEvents(): void {  
      this._signalRService.connectionEstablished.subscribe(() => {  
          this.canSendMessage = true;  
      });  

      this._signalRService.messageReceived.subscribe((message: GetClockTime) => { 
          this._ngZone.run(() => {  
              this.allMessages = message;  
          });  
      });  
  }  
}