3

我已经使用setInterval设置了 AJAX 页面刷新。有时,服务器速度很慢,以至于在前一个请求完成之前就发起了一个新请求。

我怎样才能防止这种情况?

4

4 回答 4

6

使用比刷新间隔更短的超时值。当请求超时时,它将调用错误处理程序,因此您需要区分处理程序中的超时错误和其他类型的错误。

 $.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   timeout: 5000, /* ms or 5s */
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
 });

jquery.com 上的文档。上述示例来自同一来源,但添加了超时值。

于 2009-02-03T21:44:20.510 回答
2

改用 setTimeout,只有在收到 AJAX 请求的结果后才启动另一个 setTimeout。这样,刷新仅在自上次刷新后的指定时间段后发生。

于 2009-02-03T21:45:10.320 回答
2

代替使用固定的硬编码间隔:触发下一次刷新作为处理当前刷新的最后一步,例如在“成功”(或“完成”)事件回调中。

您可以添加一个变量来跟踪当前请求的发送时间,以便计算动态延迟:

  1. 取当前时间 T1
  2. 发送异步请求
  3. 其他事情发生...
  4. 异步请求返回,回调执行
  5. 从当前时间减去 T1
  6. 如果结果<您想要的请求间隔,设置延迟值> 0
  7. 如果结果 >= 您想要的请求间隔,则设置延迟值 = 0
  8. 使用延迟值调用 setTimeout,启动下一个周期
于 2009-02-03T22:32:27.307 回答
2

我可以告诉你的是,在你的代码中使用一个标志。喜欢(不是我实际推荐的只是一个简单的例子)

var isWorking = false;
function doRequest(){
  if(isWorking) return;
  isWorking = true;
  $.ajax({
    ...,
    success: workWithResponse
  });
}

function workWithResponse(){
  /* doAnythingelse */
  isWorking = false;
}

setInterval(doRequest,1000);

类似的东西,它很原始,但你会避免竞争条件。问候。

于 2009-02-03T23:00:26.423 回答