Javascript轮询服务器.这会导致堆栈溢出吗?
作者:互联网
我不太熟悉每个浏览器上每个javascript实现的细节.我确实知道,但是使用setTimeout可以在单独的线程上调用传入的方法.那么在方法内部递归使用setTimeout会导致其堆栈无限期增长,直到导致堆栈溢出?还是会创建一个单独的调用堆栈并在失去焦点时破坏当前帧?这是我想知道的代码.
function pollServer()
{
$.getJSON("poll.php", {}, function(data){
window.setTimeout(pollServer, 1000);
});
}
window.setTimeout(pollServer, 0);
我想每秒钟左右轮询一次服务器,但是不想浪费CPU周期,而使用“阻塞循环”-我也不想设置一个时间限制,即用户在浏览器死机之前可以访问页面的时间.
编辑
使用firebug,我设置了一些断点,并通过查看“脚本->堆栈”面板来看到调用堆栈实际上只是“ pollServer”,并且不会随每次调用而增长.这很好-但是,JS的其他实现是否有所不同?
解决方法:
我不确定是否会导致堆栈溢出,但是如果周期是恒定的,我建议您使用setInterval.
这就是prototype实现其PeriodicalExecuter的方式.
// Taken from Prototype (www.prototypejs.org)
var PeriodicalExecuter = Class.create({
initialize: function(callback, frequency) {
this.callback = callback;
this.frequency = frequency;
this.currentlyExecuting = false;
this.registerCallback();
},
registerCallback: function() {
this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
},
execute: function() {
this.callback(this);
},
stop: function() {
if (!this.timer) return;
clearInterval(this.timer);
this.timer = null;
},
onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true;
this.execute();
} finally {
this.currentlyExecuting = false;
}
}
}
});
标签:stack-overflow,callstack,ajax-polling,javascript 来源: https://codeday.me/bug/20191210/2102574.html