在 SignalR 的事件处理程序中访问属性时始终未定义

Posted

技术标签:

【中文标题】在 SignalR 的事件处理程序中访问属性时始终未定义【英文标题】:Property always undefined when accessing it in Event Handler from SignalR 【发布时间】:2019-03-28 13:55:28 【问题描述】:

我已经构建了一个 Angular 应用程序,并且我正在使用 signalR 来获取通知。

对于 signalR 的东西,我已经安装了 "@aspnet/signalr": "^1.0.4"。

在 Angular 应用程序中,我构建了一个服务来处理通过 signalR 发送的所有通知:

private _hubConnection: HubConnection;

numberX: number = 0;

constructor() 
  this.createConnection();
  this.registerOnServerEvents();
  this.startConnection();


private createConnection() 
  this._hubConnection = new HubConnectionBuilder().withUrl(someURL).build();


private startConnection(): void 
  this._hubConnection.start();


private registerOnServerEvents(): void 
  this._hubConnection.on('Notify', (data: any) => 
    this.numberX++;
  );

当我从 signalR 获得事件时,事件处理程序实际上被调用,当我向控制台输出发送一些东西时,它实际上被写入控制台。

但是当我尝试访问成员属性(在本例中为 numberX)时,我总是收到一个异常,告诉我 numberX 未定义,即使我在一开始就定义了它。

这可能是某种范围的事情吗?

编辑: Kenzk447 的解决方案实际上适用于我给定的场景。但是,如果我更进一步,不仅要增加数量,还要使用组件可以使用的 EventEmitter,这将不起作用:

在服务中:

someEvent: EventEmitter<any> = new EventEmitter();

private registerOnServerEvents(): void 
const $self = this;
this._hubConnection.on('ErrorMessage', (data: any) => 
     $self.someEvent.emit(data);
);

在组件中:

notificationCount: number = 0;

this.notificationService.someEvent.subscribe(this.onSomeEvent);

onSomeEvent(data: any) 
    this.notificationCount++;

执行此操作时,组件中的“this”未定义,我无法访问组件的属性。

编辑 2:

好的,我可以使用它了 this solution

诀窍是绑定 eventHandler。

尽管如此,我会接受答案,因为它在我给定的示例中有效,并为我指明了正确的方向。

【问题讨论】:

【参考方案1】:

我研究了 SignalR repo,我 found:

methods.forEach((m) => m.apply(this, invocationMessage.arguments));

这里的问题:m.apply(this,...,SignalR 试图将“this”强加为 HubConnection 类实例。所以,我的解决方案:

private registerOnServerEvents(): void 
    const $self = this;
    this._hubConnection.on('Notify', (data: any) => 
         $self.numberX++;
    );

【讨论】:

以上是关于在 SignalR 的事件处理程序中访问属性时始终未定义的主要内容,如果未能解决你的问题,请参考以下文章

SignalR Context.User.Name 返回空

建立连接时的 SignalR Core 调用函数

使用 .NET 客户端时的 SignalR 传输

是否已添加事件处理程序?

在 dragstart 事件处理程序中 event.dataTransfer 和 event.originalEvent 始终为 null

使用DBContext ChangeTracker编写基于事件的SignalR Notification Service - 关注点分离