【问题标题】:clearSetTimeout, prevent setTimeout's from stacking upclearSetTimeout,防止setTimeout的堆积
【发布时间】:2012-08-23 19:09:02
【问题描述】:

我在递归中使用 setTimeouts 来模拟 setInterval,同时防止它自行运行,例如:

this.poll = function() {
    var self = this;
    if(self.timeout) {
          clearTimeout(self.timeout)
    }
    self.timeout = setTimeout(function(){
      self.request();
    }, 1000);
}

self.request(); 包含 ajax 逻辑并调用 this.poll()

问题是当this.poll 再次被调用时,它似乎并没有真正清除超时,我最终得到了大量的请求。

有没有更好的方法来处理这个问题?

谢谢!

【问题讨论】:

  • self.request(); contains ajax logic and calls this.poll() -- request 是立即调用 poll,还是在其 Ajax 回调中?如果它立即执行,那么我希望您最终会收到大量请求,因为request 正在产生一个新的 Ajax 请求,然后立即排队一个新的请求以在下一秒运行,可能在旧请求之前已解决。 (除非您的意图实际上是每秒轮询一次。)
  • request 在 ajax 回调中调用 poll,目的是每秒运行一次。但是现在,如果我刷新页面几次,我会在开始时收到一堆请求。
  • 如果刷新页面,它会终止超时,清除 JavaScript。您看到的是上一页加载的旧请求。
  • 啊啊啊啊,抱歉,我在投票中接到了另一个请求。

标签: javascript ajax settimeout


【解决方案1】:

为什么要模拟 setInterval 而不是使用 flag 来防止同时运行两次?

this.poll = function(){
  if(this.running) return;
  this.running = true;
  var self = this;
  setIntervar(function(){
     var callback = function(){
        //your stuff 
        self.running = 0;
     };
     self.request(.....,callback);
  },1000)
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多