使用node.js,我设置了一个计时器来连接TCP server.when it成功,它将是cleared.However it server.when work.just像这样:
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();
定时器可以清除我不能解释it.why?请多多帮助me.Thanks。
发布于 2015-07-10 10:01:57
关于使用间隔标识符的一些信息/建议:
Node.js:
setInterval()
的返回值是一个object,它包含您创建的时间间隔的所有信息。即使在使用对象作为参数调用clearInterval()
之后,对象也不会设置为null。您应该检查对象的_repeat
标志,以检查间隔是否正在运行。
var interval_id = setInterval(function() { }, 10000);
if (interval_id._repeat)
{
clearInterval(interval_id);
}
客户端javascript:
setInterval()
的返回值是一个整数,它是您创建的时间间隔的id。当您调用clearInterval()
时,它不会取消设置存储此整数id的变量。如果您打算将clearInterval()
用作间隔是否正在运行的标志,则应在调用它之后手动执行此操作。
var interval_id = setInterval(function() { }, 10000);
if (interval_id)
{
clearInterval(interval_id);
interval_id = null;
}
发布于 2015-07-10 09:34:39
我认为这是因为setInterval是在套接字连接关闭时调用的,但是您试图在套接字第一次打开时更早地取消间隔。
因此,当您调用
clearInterval(connectTransferTick)
在这一点上connectTransferTick
仍然是null
,因为
connectTransferTick = setInterval()
还没有发生。
发布于 2015-07-10 09:50:03
因为当满足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();
https://stackoverflow.com/questions/31337140
复制相似问题