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

上次做了一个完整的白痴错误,所以这次双重检查。 这里是代码片段:

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之上而不等待,并且延迟值是不确定的。

当你这样做

 setTimeout(monConnect,delay); 

monConnect将在delay毫秒后被调用。 但是,由于monConnect没有传递任何值,因此将会有undefineddelay (默认值)。

为了解决这个问题,你可以把实际的parameter passing给传递给setTimeout的函数,像这样

 setTimeout(monConnect, delay, delay); 

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

当您第二次调用monConnect时, delay不会被传递。 你需要:

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

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

 setInterval(fn, delay); 

有一个细微的差别,如果fn运行超过delay毫秒,这可能会失败,但是你的函数不应该花那么长时间才能运行。

只需修复这一个电话:

 setTimeout(monConnect(delay), delay);