编程语言
首页 > 编程语言> > Javascript轮询服务器.这会导致堆栈溢出吗?

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