setInterval替代方案

时间:2010-03-15 16:50:17

标签: javascript jquery setinterval

在我的应用程序中,我每秒都会在网络服务器上查询邮件并在前端显示它们。 我使用setInterval来实现这一点。但是,只要用户停留在该页面上,即使没有数据,客户端也会继续使用请求轮询服务器。当通过设置变量不再生成消息时,服务器会给出指示。 我想使用这个变量clearInterval并停止计时器,但这不起作用。在这种情况下我还能使用什么? 我正在使用jquery和django。这是我的代码:

jquery:
 var refresh = setInterval(
        function ()
            {
                var toLoad = '/myMonitor'+' #content';             
                $('#content').load(toLoad).show();

            }, 1000); // refresh every 1000 milliseconds
    });

html:
div id=content is here 

我可以通过每次刷新访问django变量以在html中完成。如果有的话,我该如何设置clearInterval?

注意:堆栈溢出不允许我放& gt& lt所以html不完整

由于

2010年3月16日更新 我一定做错了什么。但无法弄清楚。这是我的clearTimer脚本,它不起作用。


var timer = null;
$(function(){
        if ("{{status}}" == "False")
        {
           clearInterval(timer);
        }
        else
        {
            timer = setInterval(
                function(){
                    var toLoad = '/myMonitor'+' #content';  
                    $('#content').load(toLoad).show();} 
                    ,1000); // refresh every 1000 milliseconds
        }
    });

status是“views.py”(Django)中的布尔值集。 非常感谢。

2 个答案:

答案 0 :(得分:3)

有几个人已经回答了你问题的具体资源,所以我想我会提供一些背景知识。

简而言之,您希望服务器将数据推送到浏览器以避免广泛的客户端轮询。没有一种良好的跨浏览器方式来支持服务器推送,因此需要更少轮询的常见解决方案是使用Comet(另一种清洁产品,如AJAX)长轮询技术。

使用Comet,浏览器发出请求,服务器保持连接打开而不响应,直到有新数据可用。当服务器 有新数据时,它会通过打开的连接发送它,浏览器会立即收到它。如果连接超时,浏览器将打开一个新连接。这使服务器一旦可用就将数据发送到客户端。正如其他人所指出的,这种方法需要对Web服务器进行特殊配置。您需要服务器上的脚本以一定间隔检查数据,并响应客户端(如果存在)。

这种方法要记住的是,大多数Web服务器都是为了从客户端获取请求并尽快响应而构建的;它们不打算长时间保持活力。使用Comet,您将拥有比正常情况更多的开放连接,可能消耗的资源超出您的预期。

答案 1 :(得分:0)

您的clearInterval检查仅检查何时触发文档就绪事件。

如果您提供的代码正是浏览器中的代码,那么您将字符串“{{status}}”与字符串“False”进行比较。我宁愿看油漆干,也不愿等待评价为真。

如果您的请求需要超过1秒才能完成,该怎么办? :您将通过请求充斥您的服务器。

function update () {
  $('#content').show().load('/myMonitor'+' #content', function (response, status) {
    if (!/* whatever you're trying to check*/) {
      setTimeout(update, 1000);
    };
  });
};

$(document).ready(function () {
  update();
});

比你原来的地方更近,但是你还需要弄清楚如何决定何时停止投票。