为了账号安全,请及时绑定邮箱和手机立即绑定

如何在类中从自身调用方法?

如何在类中从自身调用方法?

牧羊人nacy 2022-06-05 09:48:43
我目前正在实现一个 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 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

存在三个问题:

  • 要引用对象的属性,请使用.,例如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);

    };

  }

}


查看完整回答
反对 回复 2022-06-05
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我找到了解决方案。因为this引用ws.onclose,我需要在我的函数顶部立即保护它:


class Connector {

    constructor(options = {}) {

        this.url = "ws://localhost:8181";

        this.connect();

    }

    connect() {

        const ws = new WebSocket(this.url),

              self = this;


        ws.onclose = (event) => {

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

            setTimeout(() => {

                self.connect();

            }, 5000);

        };

    }

}


查看完整回答
反对 回复 2022-06-05
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信