Переподключить веб-сокет, если он закрыт

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

  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.info("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);
  }

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

Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Этот пост - краткая презентация netty-websocket-http1 - альтернативной netty/java реализации RFC6455 - протокола WebSocket.
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Здесь мы рассмотрим, как можно использовать Websocket в Deno и развернуть его в Deno deploy. Мы будем слушать Websocket, а также отправлять сообщения.
0
0
188
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Чтобы восстановить подключение, измените это

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

К этому

this.ws.onclose = () => {
    console.info("trying to reconnect");
    this.subject = null;
    this.connect();
}

вы также можете обновить, как вызывать эту функцию каждые X секунд?

Mohit Harshan 21.06.2019 08:02

Можно подробнее?

Meme Composer 21.06.2019 09:00

Другие вопросы по теме