Как я могу вызвать метод из себя внутри класса? - PullRequest
0 голосов
/ 28 марта 2020

В настоящее время я использую WebSocket. Поскольку я хочу переподключиться, когда соединение закрывается, я реализовал функцию connect() и попытался вызвать ее внутри события close из самого себя, но, к сожалению, он не работает:

class WebSocket {
    constructor( options = {} ) {
        this.url = "ws://localhost:8181";

        this.connect();
    }

    connect() {
        let ws = new WebSocket( this.url );

        ws.onclose = function ( event ) {
            console.log( `WebSocket connection to ${ this.url } failed: ${ event.reason }` );

            setTimeout( function () {
                connect();
            }, 5000 );
        };
    }
} 

Сгенерирована ошибка :

Uncaught ReferenceError: connect is not defined

Я никогда не работал с классами в JavaScript, поэтому я немного растерялся. Может быть, кто-то может дать мне подсказку?

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Существует три проблемы:

  • Для ссылки на свойство объекта используйте ., например obj.prop. Здесь объект, для которого свойство, на которое вы хотите сослаться, является экземпляром, this.
  • Необходимо убедиться, что this ссылается на экземпляр класса внутри setTimeout, поэтому используйте функции стрелок
  • Имя класса WebSocket вступает в противоречие со свойством globalThis.Websocket лексической области - назовите свой класс как-нибудь еще:
class Connector {
  constructor(options = {}) {
    this.url = "ws://localhost:8181";
    this.connect();
  }
  connect() {
    const ws = new WebSocket(this.url);
    ws.onclose = (event) => {
      console.log(`WebSocket connection to ${ this.url } failed: ${ event.reason }`);
      setTimeout(() => {
        this.connect();
      }, 5000);
    };
  }
}
0 голосов
/ 28 марта 2020

Я нашел решение. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * this * * * * * * * * * * * * * * * * * * 100 * * 100%

...