Как повторно использовать Promise после его использования один раз в моей службе Angular?

#promise #signalr #angular10

#обещание #signalr #angular10

Вопрос:

У меня проблема с моим Angular Promise<void> в одном из моих сервисов.

Служба устанавливает соединение SignalR с концентратором сервера. И я жду, когда будет передана трансляция на концентратор для установления соединения:

 export class SignalRService {
  private hubConnection: signalR.HubConnection;
  private url = environment.apiUrl   'messageHub';
  private thenable: Promise<void>;

public startConnection = (): void => {
    if (!this.hubConnection) {
      const token = this.auth.getAuth().token;
      this.hubConnection = new signalR.HubConnectionBuilder()
        .withUrl(this.url, { accessTokenFactory: () => token })
        .build();
      this.startHubConnection();

      this.hubConnection.onclose(() => this.connectionHubClosed());
    }
  };

private startHubConnection() {
    this.thenable = this.hubConnection.start();
    this.thenable
      .then(() => console.log('Connection started!'))
      .catch((err) => console.log('Error while establishing connection :('));
  }

public broadcastGameState = (): void => {
    this.thenable.then(() => {
      const name = this.auth.getAuth().displayName;
      let message = this.game.getGame();
      this.hubConnection
        .invoke('SendMessage', message)
        .catch((err) => console.error(err));
    });
  };
  

Но после того, как я закрою свое соединение с:

 public stopConnection = (): void => {
    if (this.hubConnection) {
      this.hubConnection.stop();
    }
  };
  

и снова используйте мой сервис, я больше не могу использовать свой thenable и broadcastGameState больше не жду его, выдавая ошибку:

Ошибка: не удается отправить данные, если соединение не находится в состоянии «Подключено».

Я не понимаю, почему?

Комментарии:

1. «и `broadcastGameState» больше не ждет его, выдавая ошибку» Ну, на данный момент это уже решенное обещание, оно должно просто выполняться сразу.

2. @xxh ты понял свою точку зрения и заставил меня задуматься, поэтому я нашел проблему 🙂 Описано в ответе.

3. Приятно слышать, удачи!

Ответ №1:

xxh вы поняли свою точку зрения и заставили меня задуматься, поэтому я нашел проблему 🙂 После вызова:

 public stopConnection = (): void => {
    if (this.hubConnection) {
      this.hubConnection.stop();
    }
  };
  

при закрытии соединения вызывается:

 private connectionHubClosed(): void {
    //trigerred when lost connection with server
    alert('todo: SignalR connection closed');
  }
  

НО this.HubConnection по-прежнему имеет присвоенное значение, поэтому из-за if (!this.hubConnection) new this.thenable было пропущено.