2012-08-23 44 views
0

我使用递归一个定时器,模拟的setInterval,同时防止它在自身上,例如运行:clearSetTimeout,防止setTimeout的公司从堆放

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被再次调用时,它似乎没有真正清除超时,并且最终导致大量请求相互重叠。

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

谢谢!

+1

'self.request();包含ajax逻辑并调用this.poll()' - 请求'立即调用'poll',还是在其Ajax回调中调用?如果它立即执行,那么我希望你最终会得到大量的请求,因为'request'产生了一个新的Ajax请求,然后立即排队一个新的请求在下一秒运行,可能在旧请求之前已解决。 (除非你的意图实际上是每隔一秒轮询一次)。 – apsillers

+0

'request'在ajax回调中调用'poll',意图是每秒运行一次。但是现在,如果我刷新页面几次,我会在开始时收到一些请求。 – dzm

+1

如果刷新页面,则会导致超时,从而清除JavaScript。你所看到的是来自上一页加载的旧请求。 – epascarello

回答

0

为什么模仿setinterterval而不是使用标志来防止同时运行两次?

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) 
}