我有一个类来管理我在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
答案 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”处理程序也称为“出错”(对于某些错误,至少)。