繁体   English   中英

如何使jQuery连续请求相同的HTTP GET请求

[英]How to make jQuery to continously request the same HTTP GET request

我正在实现一个使用$ .getJSON读取jQuery系统状态的软件。

我的想法是我要在浏览器中显示实时数据,并希望尽可能频繁地更新数据。 该服务器也在本地主机上运行,​​因此从理论上讲我应该能够获得非常低的延迟(至少<50 ms,甚至少于20 ms)。

但是问题是这样的:我如何用jQuery实现getJSON,以便HTTP GET请求在较早的请求完成后立即自动重新发送?

在当前的实现中,我定义了一个更新函数:

function updateSimulation() {       
   $.getJSON('/simulation/', function(data) {
      // ..parse data here
   });    
}

并每50毫秒添加一次回调:

document.simulationIntervalId = setInterval( "updateSimulation()", 50 );

问题在于,如果一个请求花费的时间超过50毫秒,则多个请求将异步等待结果,这意味着如果一个请求花费的时间更长,则较旧的数据可能会被较新的数据替换,这是不希望的。

因此,基本上,这意味着可以考虑以下两种解决方案之一:1)当响应到达时,所有挂起的请求都可能被杀死(不是最佳的),2)仅在上一个请求返回后才发送新请求(也许是最佳的)解)。

但是与往常一样,所有评论和答案都非常感谢!

为什么不对成功函数($ .getJSON的第二个参数)调用updateSimulation?

上一个请求完成后,它将执行请求。

首先,在使用setInterval()setTimeout() ,请勿将方法作为字符串传递,因为这会调用臭名昭著的eval() ,这是不良的编码实践。 而是这样传递方法: setInterval(updateSimulation, 50);

为了确保ajax请求在发送另一个请求之前已经完成,请使用setTimeout()仅调用一次updateSimulation()方法,然后在jquery的ajax成功事件上再次调用updateSimulation()

首先解析并使用数据,然后发出延迟的呼叫

处理完当前window.setTimeout()后,请改用window.setTimeout()并重新发出另一个。 这样就不会有重叠

function updateSimulation() {
   $.getJSON('/simulation/', function(data) {
      // ..parse data here
      window.setTimeout(updateSimulation, 250);
   });
}

根据需要调整时间...

请改用setTimeout,并在先例调用返回时调用它。 返回后将运行50毫秒(顺便说一句,50毫秒对于AJAX来说太小了,请考虑500毫秒或1000)

您还可以将时间戳添加到发送的数据,并将其与上一个已知的超时进行比较

function updateSimulation() {               
   $.getJSON('/simulation/', function(data) {
         window.setTimeout(updateSimulation, 500 );

         if (data.sent > last_data_sent){
           // use data
           last_data_sent = data.sent

         }

   });              
}

您还可以将setInterval与所需的时间段(例如50ms)一起使用,并添加一个指示器以了解上一个请求是否已完成。 该指标不一定必须包含在全局数组中。

function updateSimulation() {
   if (!requesting) {
      requesting = true;
      $.getJSON('/simulation/', function(data) {
         requesting = false;
      });
   }
}

var requesting = false;
setInterval ('updateSimulation', 50);

命名空间是您使用的对象。

2)听起来不错,但50ms有点快。 我不认为服务器会喜欢它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM