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

时间:2010-12-22 13:10:56

标签: jquery ajax comet real-time

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

我的想法是我在浏览器中显示实时数据,并希望尽可能频繁地更新数据。服务器也在localhost上运行,所以理论上我应该能够获得非常低的延迟(至少<50 ms,甚至不到20)。

但问题是:如何使用jQuery实现getJSON,以便在先前的请求完成后直接自动重新发送HTTP GET请求?

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

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

每50毫秒添加一次回调:

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

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

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

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

首先,在使用setInterval()setTimeout()时,请不要将该方法作为字符串传递,因为这会调用臭名昭着的eval(),这是一种糟糕的编码习惯。而是通过这样的方法:setInterval(updateSimulation, 50);

要确保ajax请求在另一个请求被发送之前完成,请使用setTimeout()仅调用updateSimulation()方法一次,然后在jquery的ajax成功事件中调用{{1}再次。

答案 2 :(得分:1)

先解析并使用数据,然后发出延期通话

使用window.setTimeout()代替,并在完成当前处理之后重新发出另一个。这样就不会有重叠

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

根据需要调整时间......

答案 3 :(得分:1)

使用setTimeout,并在返回先前调用时调用它。它将在返回后运行50 ms(顺便说一下,50 ms对于AJAX而言太小,想想500 ms或1000)

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

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

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

         }

   });              
}

答案 4 :(得分:1)

您还可以将setInterval与期望的时间段(例如50ms)一起使用,并添加指示符以了解先前的请求是否已完成。 这个指标不一定是在gobal数组中。

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

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

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

答案 5 :(得分:0)

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