这很奇怪。我有代码:
var client = {
init: function () {
this.connect();
return this;
},
connect: function () {
var clientObj = this;
this.socket = net.connect({
port: config.port,
host: config.host
}, function () {
log_ts('Connected to serv');
});
this.socket.on('data', this.dataParser);
this.socket.on('end', function () {
logerr_ts('Disconnected from serv');
logerr_ts('Trying to reconnect after '+config.reconnectTimeout + 'ms');
setTimeout(clientObj.connect, config.reconnectTimeout);
});
},
dataParser: function (data) {
//analyzing data from me6d server
}
};
现在当它从serv中被取消时,它正在尝试重新连接,我收到了这个错误:
2015-04-12 15:22:12 Trying to reconnect after 500ms
events.js:142
throw TypeError('listener must be a function');
^
TypeError: listener must be a function
at TypeError (native)
at Socket.addListener (events.js:142:11)
at Socket.Readable.on (_stream_readable.js:671:33)
at me6dClient.connect [as _onTimeout] (/var/www/nodejs/client/index.js:212:15)
at Timer.listOnTimeout (timers.js:110:15)
它怎么样? this.dataParser是一个函数。当超时被触发时,可能是它的某些想法变得糟糕,它改变了这个的上下文?但是如何?)
答案 0 :(得分:3)
问题是使用clientObj.connect
作为参考将失去它所绑定的上下文。
您可以像这样重新绑定它:
setTimeout(clientObj.connect.bind(clientObj), ...);
这基本上意味着“达到超时时,使用clientObj.connect
作为clientObj
”致电this
。
FWIW,这里也是如此:
this.socket.on('data', this.dataParser)
如果没有正确的上下文,也会调用dataParser
方法。这个问题(如果实际上 是一个问题)可以用类似的方式解决。