2012-04-01 106 views
2

我的ASP.NET MVC页面使用JavaScript/jQuery来每秒轮询我的数据库。防止JavaScript定时器重新输入

这是工作,但我想确保,如果有一个延迟,我的计时器处理程序不会再被调用之前,它已经返回。

除了将定时器ID存储在全局变量中,清除我的处理程序中的定时器以及在处理程序完成时重新启动定时器之外,还有其他技巧。

注意:我意识到每一秒似乎都很频繁,但此代码在提交信用卡付款后轮询我的服务器。通常情况下,它只会运行一秒左右,我不希望用户等待超过必要的时间。

回答

5

每秒轮询一次?这很重!

另外,当使用setTimeout而不是setInterval时,您将不会遇到此问题。后者确保一段代码在给定的时间间隔内运行x次,而前者确保延迟至少x毫秒。

function some_poller() { 
    $.ajax({ 
     url: '/some_page', 
     success: function() { 
      setTimeout(some_poller, 1000); 
     }, 
     error: function() { // Also retry when the request fails 
      setTimeout(some_poller, 1000); 
     } 
    }); 
} 

// Init somewhere 
some_poller(); 
+0

我需要继续运行该代码,直到得到结果或者等待时间过长。我纠正'setTimeout'只调用一次目标,然后清除该函数使用的任何内部定时器?换句话说,我可以使用它,但是每次调用处理程序时我都必须再次调用'setTimeout'? – 2012-04-01 20:16:22

+0

@JonathanWood'setTimeout'不会清除任何东西,因为它应该运行一次**函数**。另一方面,'setInterval'确保给定的函数被定期执行。如果您仍然感到困惑,请阅读链接的文档。 – 2012-04-02 17:49:45

1

不是真的,虽然我不会推荐使用全局变量。把它放在一些功能里面。

但是你真的确定需要每秒轮询一次吗?这是一个非常健谈的界面。

0

根据我个人的经验,“全局”(在根函数内部)变量在这种情况下工作得非常好,因此您可以控制何时清除和重新启动。如果回复真的如你所说的那么快,这不会造成太多的开销(清除/重置),并且会考虑到这些类型的情况。