Не могу отписаться от событий SignalR - PullRequest
0 голосов
/ 22 января 2019

У меня есть несколько Angular компонентов, которые подписываются на SignalR концентраторное соединение. Я обернул объект соединения концентратора SignalR с угловой службой, hubconnection.service.ts:

import { Injectable } from '@angular/core';
import { HubConnectionBuilder, HubConnection } from '@aspnet/signalr';

@Injectable()
export class HubConnectionService {
    public MyHubConnection: HubConnection;

    constructor() {
        this.MyHubConnection = new HubConnectionBuilder()
            .withUrl('/sensorHub')
            .build();

        this.MyHubConnection
            .start()
            .then(() => console.log('[HubConnectionService] Connection started'))
            .catch(err => console.log('[HubConnectionService] Error while starting connection: ' + err));
    }
}

Теперь у меня есть компонент, из которого я хочу подписаться на данные, полученные через хаб SignalR, для этого я импортирую свою оболочку SignalR, а в конструкторе я вызываю метод .on(). Чтобы отписаться от этого события, я вызываю метод .off() в деструкторе:

export class RawdataComponent implements OnInit {
    constructor(private hubConnectionService: HubConnectionService) { }

    ngOnDestroy() {
        this.hubConnectionService.MyHubConnection.off('Broadcast');
    }

    ngOnInit() {
        this.hubConnectionService.MyHubConnection.on('Broadcast',
                function(sender, message) {
                  console.log('New message received: ' + message);
                });
    }
}

Когда я вначале захожу на страницу, которая описывается этим компонентом, все работает как положено (console.log() регистрирует каждое полученное сообщение).

Когда я покидаю страницу, вызывается MyHubConnection.off('Broadcast');. Затем, после того как я снова получаю доступ к предыдущей странице, вызывается конструктор и делается другая подписка, но предыдущая не закрывается, и я получаю два console.log() вызова.

Где ошибка, которую я делаю? Разве MyHubConnection.off('Broadcast'); не должен закрывать текущую подписку, когда я покидаю страницу?

...