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
没有传递任何值,因此将会有undefined
的delay
(默认值)。
为了解决这个问题,你可以把实际的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);