使用node.js,我设置了一个定时器来连接TCP服务器。当它成功时,它将被清除。但是它没有工作。就像这样:
var net = require('net');
var connectTransferTick=null;
var client ;
client = new net.Socket();
function clientConnect() {
client.connect(8009, '127.0.0.1', function () {
console.log('success,clear timer');
if(connectTransferTick!=null);
{
clearInterval(connectTransferTick);
}
});
client.on('error',function()
{});
client.on('close', function () {
console.log('The server had been closed,Try to connect it again later');
if(connectTransferTick!=null)
{
console.log(clearInterval(connectTransferTick));
}
connectTransferTick = setInterval(clientConnect,1000);
});
}
clientConnect();
运行它,你会发现计时器无法清除。
虽然,我只是将此代码放在函数clientConnect()中,如下所示:
function clientConnect() {
client = new net.Socket();
计时器可以清除。我无法解释它。为什么?请帮帮我。谢谢。
答案 0 :(得分:0)
我认为因为当Socket连接关闭时会调用setInterval,但是当你第一次打开Socket时,你正试图取消早于此的时间间隔。
因此,当你打电话
clearInterval(connectTransferTick)
此时connectTransferTick
仍为null
,因为
connectTransferTick = setInterval()
尚未发生。
答案 1 :(得分:0)
因为当满足close
时,它将至少再次调用clientConnect
,并将另一个onclose
注册到客户端。因此,每次结束时,您都会注册更多setInterval
,而您只能清除最新信息。
所以
function clientConnect() {
client = new net.Socket();
有效,因为您创建了一个新的套接字,但尚未定义onclose
处理程序,因此它不会多次执行setInterval
。
所以你应该使用一个标志来防止多次注册事件:
var net = require('net');
var connectTransferTick=null;
var client ;
client = new net.Socket();
function clientConnect(isInited) {
client.connect(8009, '127.0.0.1', function () {
console.log('success,clear timer');
if(connectTransferTick!=null);
{
clearInterval(connectTransferTick);
}
});
// Prevent events registered many times.
if (!isInited) {
client.on('error',function(){});
client.on('close', function () {
console.log('The server had been closed,Try to connect it again later');
if(connectTransferTick!=null)
{
console.log(clearInterval(connectTransferTick));
}
// Pass a flag to the clientConnect
connectTransferTick = setInterval(clientConnect,1000, true);
});
}
}
clientConnect();
此外,我认为setTimeout
应该足以解决这个问题了吗?
var net = require('net');
var client ;
client = new net.Socket();
function clientConnect(isInited) {
client.connect(8009, '127.0.0.1', function () {
console.log('success,clear timer');
});
// Prevent events registered many times.
if (!isInited) {
client.on('error',function(){});
client.on('close', function () {
console.log('The server had been closed,Try to connect it again later');
connectTransferTick = setTimeout(clientConnect,1000, true);
});
}
}
clientConnect();
答案 2 :(得分:0)
关于使用区间标识符的一些信息/建议:
<强> Node.js的:强>
setInterval()
的返回值是一个对象,其中包含有关您创建的间隔的所有信息。即使在将对象作为参数调用clearInterval()
之后,该对象也不会设置为null。您应该检查对象的_repeat
标志以检查间隔是否正在运行。
var interval_id = setInterval(function() { }, 10000);
if (interval_id._repeat)
{
clearInterval(interval_id);
}
客户端javascript:
setInterval()
的返回值是一个int,它是您创建的间隔的id。当您调用clearInterval()
时,它不会取消设置存储此整数ID的变量。如果要将其用作间隔是否正在运行的标志,则应在调用clearInterval()
后手动执行此操作。
var interval_id = setInterval(function() { }, 10000);
if (interval_id)
{
clearInterval(interval_id);
interval_id = null;
}