переподключите веб-сокет, если он закрыт - PullRequest
0 голосов
/ 21 июня 2019

Код подключения к моему веб-сокету:

  public connect(): Subject<MessageEvent> {
    if (!this.subject) {
      this.subject = this.create(this.url);

    }
    this.ws.onerror = () => {
      this.close();
      let refresh = setInterval(() => {
        this.subject = null;
        this.connect();
        this.ws.onopen = () => {
          clearInterval(refresh)
        }
      }, 5000);
    }

    return this.subject;
  }

  private create(url: string){
    this.ws = new WebSocket(url);
    const observable = Observable.create((obs: Subject<MessageEvent>) => {
      this.ws.onmessage = obs.next.bind(obs);
      this.ws.onerror = obs.error.bind(obs);
      this.ws.onclose = obs.complete.bind(obs);
      this.ws.onclose = function () {
        console.log("trying to reconnect");
        this.connect();
      }

      return this.ws.close.bind(this.ws);
    });

    const observer = {
      next: (data: any) => {
        if (this.ws.readyState === WebSocket.OPEN) {
          this.ws.send(JSON.stringify(data));
        }
      }
    };
    return Subject.create(observer, observable);
  }

Я хочу повторно подключить веб-сокет, если соединение закрывается.В тот момент, когда функция перестает работать, когда я останавливаю веб-сокет.BUt не подключается снова. Я вижу ошибку «this.connect не является функцией». Как работать с угловыми рекурсивными функциями?

1 Ответ

1 голос
/ 21 июня 2019

Не используйте ключевое слово function для создания обратного вызова при использовании внутри него this, если вы не знаете, как оно меняет ссылку this в зависимости от контекста выполнения, используйте функцию стрелки вместо

Чтобы восстановить соединение, измените это

this.ws.onclose = function () {
    console.log("trying to reconnect");
    this.connect();
}

К этому

this.ws.onclose = () => {
    console.log("trying to reconnect");
    this.subject = null;
    this.connect();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...