在Node应用程序中,我有一个每30秒运行一次的函数。
使用moment().day()
打印到控制台。我让它过夜并期望它注意到现在是5
而不是4
,表示它现在是星期五而不是星期四。我今天早上检查时继续打印4
。为什么会这样?
这是一个jsfiddle https://jsfiddle.net/9ya2auzy/2/
function checkTheDay(){
setTimeout(function(){
document.getElementById("out").innerHTML = moment().day();
checkTheDay();
}, 2000);
}
checkTheDay();
它将每2秒输出当天。如果页面处于打开状态,它应该运行一夜,然后打印下一个数字6
(在撰写本文时)而不是当前输出5
(在撰写本文时)。 / p>
答案 0 :(得分:1)
您每两秒钟一次递归checkTheDay
功能一次。在足够长的时间内,你将耗尽调用堆栈。
使用setInterval
代替setTimeout
,然后您无需递归。
function checkTheDay(){
setInterval(function(){
document.getElementById("out").innerHTML = moment().day();
}, 2000);
}
checkTheDay();
通过使用Chrome调试器,设置断点和查看调用堆栈(右下方屏幕截图中的右上角),您可以看到堆栈在原始小提琴中的效果增长。
第一次迭代:
第二次迭代:
第三次迭代:
如您所见,调用堆栈正在增长。如果不加以控制,它将失去控制,直到它变得无法响应或引发错误。