Javascript 设定间隔方案

Javascript 设定间隔方案,javascript,jquery,setinterval,Javascript,Jquery,Setinterval,在我的应用程序中,我每秒轮询一次Web服务器上的消息,并将其显示在前端。 我使用setInterval来实现这一点。但是,只要用户停留在该页面上,即使没有数据,客户机也会继续使用请求轮询服务器。通过设置变量,服务器不会在不再生成消息时给出指示。 我曾想过使用这个变量来清除间隔并停止计时器,但没有成功。在这种情况下,我还能用什么? 我正在使用jquery和django。这是我的密码: jquery: var refresh = setInterval( function ()

在我的应用程序中,我每秒轮询一次Web服务器上的消息,并将其显示在前端。 我使用setInterval来实现这一点。但是,只要用户停留在该页面上,即使没有数据,客户机也会继续使用请求轮询服务器。通过设置变量,服务器不会在不再生成消息时给出指示。 我曾想过使用这个变量来清除间隔并停止计时器,但没有成功。在这种情况下,我还能用什么? 我正在使用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 jquery: var refresh=setInterval( 函数() { var toLoad='/myMonitor'+'#content'; $('#content').load(toLoad.show(); }, 1000); // 每1000毫秒刷新一次 }); html: div id=content在这里 每次刷新时,我都可以访问django变量以在html中完成。如果有,我如何设置clearInterval

注意:堆栈溢出不允许我放置><,因此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 } }); var定时器=null; $(函数(){ 如果(“{status}}”==“False”) { 清除间隔(计时器); } 其他的 { 定时器=设置间隔( 函数(){ var toLoad='/myMonitor'+'#content'; $('#content').load(toLoad.show();} ,1000);//每1000毫秒刷新一次 } }); 状态是“views.py”(Django)中的布尔集合。
非常感谢。

一些人已经用特定的资源回答了您的问题,所以我想我会提供一些背景知识

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

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


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

一些人已经用特定的资源回答了您的问题,所以我想我会提供一些背景信息

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

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


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

您的clearInterval检查仅在触发document ready事件时进行检查

如果您给出的代码与浏览器中的代码完全相同,那么您将比较字符串“{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();
});

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

您的clearInterval检查仅在触发document ready事件时进行检查

如果您给出的代码与浏览器中的代码完全相同,那么您将比较字符串“{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();
});

比你所在的地方更近,但是你仍然需要知道如何决定何时停止轮询。

你可以考虑研究Django和jQuery彗星实现,以便更好的服务器轮询。清除间隔计时器有什么“不起作用”?这对我来说总是有效的。也许你做这件事的方式有点不对劲。谢谢大家,我会看看Comet的实现。我正在访问Django模板中的变量{{result}}。我尝试在Jquery中使用“if”和“while”循环检查这个问题,并清除间隔,但这不起作用。很可能我做错了。请你给我举一个例子