Как я могу продолжать подписываться на signalR из Угловой службы, если соединение терпит неудачу?

Как я могу продолжать пытаться подключиться к сигналуR безопасным образом, что позволяет несколько сотен миллисекунд (по крайней мере) между попытками до тех пор, пока соединение не будет установлено, и если да, может ли кто-нибудь предоставить лучший способ pf, связанный с различными этапами подключения к веб-сокеты?

Мы используем signalR на бэкэнд.NET, и я пытаюсь использовать его для отображения оповещений в режиме реального времени в пользовательском интерфейсе Angular 4. Он отлично работает, когда он подключается, но есть проблема, когда иногда требуется 2-3 раза для подключения. Я также получаю ошибку this.startSignalRListener is not a function если я помещаю ее внутри блока catch, чтобы попытаться снова подключиться.

Любые предложения будут ценны.

Я использую "@aspnet/signalr-client": "^1.0.0-alpha2-final" в package.json

Вот некоторые из моего кода из моего класса сервиса...

import { HubConnection } from '@aspnet/signalr-client';

@Injectable()
export class RealTimeService implements OnInit {

 private hubConnection: HubConnection;

 constructor() {}

 ngOnInit() {
 this.startSignalRListener();
 }

 public onConnection(): void {
 const domain = this.state.domain;

 this.hubConnection
 .invoke('WatchSomething', [ 'abc.com' ])
 .catch(err => console.error('signalR error: ', err));

 this.hubConnection.on('some_thing', (res: any) => {
 console.log('do stuff...', res);
 });
 }

 public startSignalRListener() {
 const connection = 'www.realtimeapi.com';

 this.hubConnection = new HubConnection(connection);

 this.hubConnection
 .start()
 .then(() => {
 this.onConnection();
 })
 .catch(err => {
 console.log('Error while establishing connection...');
 });
 }
}

Как лучше всего подключиться, когда соединение не удастся? Любое предложение действительно помогло бы мне, поскольку это не часто с первой попытки.

1 ответ

Вы можете попытаться использовать функцию setTimeout для задержки повторных подключений:

.catch(err => {
 console.log('Error while establishing connection... Retrying...');
 setTimeout(() => this.startSignalRListener(), 3000);
});

В этом случае я предлагаю вам переместить this.hubConnection.on('domain_bid' из startSignalRListener чтобы связать этот материал только один раз.

licensed under cc by-sa 3.0 with attribution.