为什么我的clearInterval不起作用?

时间:2015-07-10 09:24:04

标签: javascript

使用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();

计时器可以清除。我无法解释它。为什么?请帮帮我。谢谢。

3 个答案:

答案 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;
}
相关问题