2010-03-15 64 views
0

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

 
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)中设置的布尔值。 谢谢你一堆。

+1

您可能会考虑研究Django和jQuery Comet实现以获得更好的服务器轮询。 http://www.rkblog.rk.edu.pl/w/p/django-and-comet/ - http://plugins.jquery.com/project/Comet – 2010-03-15 17:01:02

+0

什么“没有工作”清除间隔计时器?这对我来说总是有效的。也许你做这件事的方式有点不对。 – Pointy 2010-03-15 17:12:18

+0

谢谢你们,我会看看Comet的实现。 尖尖的, 我正在访问Django模板中的变量{{result}}。我试着用“if”和“while”循环在Jquery中检查这一点,并清除间隔,但这不起作用。我很可能做错了。请你能指点一下我应该把支票放在哪里或怎么放? 谢谢 – spyder 2010-03-15 17:30:11

回答

3

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

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

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

需要注意的是,大多数Web服务器都是为了从客户端获得请求并尽快响应而构建的,他们不打算长期保持活力。有了Comet,你将拥有比平常更开放的连接,可能会消耗比预期更多的资源。

+0

感谢瑞安对此详细的解释。理想情况下,我不想要长时间开放的连接,并且我没有像聊天会话那样的突发流量。我有一段特定的时间持续发出消息。任何其他方法? – spyder 2010-03-15 17:36:55

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

比您所在的位置更近,但您仍然需要确定如何决定何时停止轮询。