在javascript

时间:2017-09-29 15:05:16

标签: javascript node.js sockets

我有一个类来管理我在NodeJS中与套接字的连接。每当无法建立连接或丢失连接时,我想设置一个间隔以继续重试连接。但是,如果我调用setInterval函数,我作为参考传递的方法现在在setInterval的范围内。我的套接字类中的方法现在不再可用,除非我有一些巨大的嵌套语句,否则我无法重新连接套接字。主要问题是我在connect()方法中创建的事件侦听器现在不再在setInterval()范围内可用。

有关如何使其发挥作用的任何想法?

class SocketClass {

  constructor() {
    this.socket = {}
    this.port = 0
    this.host = ''
    this.intervalID = null
  }


  connect(port, host) {
    this.port = port;
    this.host = host;
    this.connectImpl()
    this.socket.on('error', () => this.errorEventHandler())
    this.socket.on('close', () => this.closeEventHandler())
  }

  connectEventHandler() {
    console.log('Connected!')
    if (this.intervalID !== null) {
      clearInterval(this.intervalID);
    }
  }

  errorEventHandler() {
    console.log('Error!')
  }

  connectImpl() {
    console.log('Trying to connect...')
    this.socket = require('net').Socket().connect(this.port, this.host)
  }

  closeEventHandler() {
    console.log('Connection lost')
    this.intervalID = setInterval(() => this.connectImpl(), 1000)
    // this.connectImpl() is called correctly but the event 
    // handlers defined in the constructor are now no longer bound
  }

}

export default new SocketClass

1 个答案:

答案 0 :(得分:3)

尽管您的评论说明了,但您实际上并未调用 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet" /> <script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script> <link rel="stylesheet" href="css/styles.css" /> <div class="container" <div class="row"> <label>End System Date:</label> <h4>1 Jul 2017</h4> </div> </div>处理程序:

connectImpl

如果没有额外的parens,你只需要传递一个箭头函数的引用,返回对this.intervalID = setInterval(() => this.connectImpl(), 1000) 函数的引用。

Re:您的编辑 - 您需要将事件处理程序注册移动到connectImpl方法中。当您的计时器触发时,这些处理程序仍然在套接字上注册(但在收集垃圾时将会显示)并且当前写入时未附加到新创建的套接字上。此不是与范围相关的问题。

您还需要确保在创建新计时器之前在connectImpl()中调用clearInterval(this.intervalID),因为“on close”处理程序也称为“出错”(对于某些错误,至少)。