setTimeout()在忽略间隔时重复调用函数

时间:2015-03-28 06:07:35

标签: javascript node.js

上次犯了一个完整的白痴错误,所以这次仔细检查。以下是代码段:

var os = require('os');

var hostName = os.hostname();
var hostPlatform = os.platform();
var hostArch = os.arch();
var hostRelease = os.release();

function collectNow(){
    var hostInfo = {
        name : hostName,
        platform : hostPlatform,
        arch : hostArch,
        release : hostRelease,
        hostUptime : os.uptime(),
        hostTotalMem : os.totalmem(),
        hostFreeMem : os.freemem()
    };
    return hostInfo;
}


function monConnect(delay){
    console.log(JSON.stringify(collectNow()));
    console.log(delay); // printing output making sure it is 10000
    setTimeout(monConnect,delay);
}

monConnect(10000);

此代码在第一次打印后等待大约10秒,然后在无限循环中保持在json上方打印而不等待,并且未定义延迟值。

3 个答案:

答案 0 :(得分:3)

当您第二次致电delay时,

monConnect未通过。你需要:

setTimeout(function () { monConnect(delay); }, delay);

请注意,为了每delay毫秒运行一个函数,您可以使用setInterval

setInterval(fn, delay);

如果fn运行时间超过delay毫秒,则可能会失败,但是您的功能不应该花费那么长的时间来运行。

答案 1 :(得分:3)

当你这样做时

setTimeout(monConnect,delay);
monConnect毫秒后将调用

delay。但是,由于monConnect未传递任何值,因此delayundefined(默认值)。

要解决此问题,您可以将实际参数传递给传递给setTimeout的函数,就像这样

setTimeout(monConnect, delay, delay);

现在,传递给setTimeout的第二个参数将是实际的时间延迟,之后应调用monConnect。第三个参数是在超时后调用时传递给monConnect的参数。

答案 2 :(得分:1)

只需修好这一个电话:

setTimeout(monConnect(delay), delay);