【问题标题】:jQuery ajax call set timeout [closed]jQuery ajax调用设置超时[关闭]
【发布时间】:2013-10-06 08:51:34
【问题描述】:
 $.ajax({
    url: "data.php"
}).done(function(data) { 
    //code
});

如何将其包装在 jQuery 超时函数中,例如每 2 秒发送一个 ajax 请求?

【问题讨论】:

  • 没有 jQuery 超时...你有 javascript setTimeout like setInterval(function(){...}, 2000)
  • 您要设置超时还是间隔?
  • 使用setInterval() - 虽然我会质疑为什么你需要每2秒执行一次?如果您需要该级别的并发性,请使用 websockets。

标签: jquery ajax


【解决方案1】:

如果您将其包装在 setInterval 中,您将冒着向服务器发送大量请求的风险,并且可能无法将它们全部恢复原状。在回调中添加timeout

function runAjax() {
    $.ajax({
        url: "data.php"
    }).done(function(data) { 
        //code
        setTimeout(runAjax, 2000); //Run it again in 2 sec
    });
}

runAjax(); //I suppose we should start the AJAX :D

【讨论】:

  • 也许在下面添加 runAjax() 以实际调用该函数一次以使其启动:)
  • @Alex -- 可能是个好主意 :)
  • 我想在有新内容时刷新一个特定的 div 我该怎么做
  • @rexhin -- 将内容加载到.done的新div中
  • 是的,我知道,但是当data.php中有新内容时如何刷新它
【解决方案2】:

我会这样做:

var ajax = null;
function callAjax()
{
  if(ajax != null)
     ajax.abort();
  ajax = $.ajax({
    url: "data.php"
  }).done(function(data) { 
    //code
  });
  setTimeout(callAjax, 1000); // Every 1 second
}
callAjax();

此代码将每 1 秒执行一次 Ajax 调用。如果另一个请求正在运行,它将在运行另一个请求之前将其终止。

更好的方法是使用长轮询: http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

【讨论】:

  • id 而是 done 回调中的超时调用
  • 取决于你想做什么。如果您想确保每秒发送一次请求,或者如果您想在成功后一秒钟再次启动它。它实际上有很大的不同。
  • 为什么不if(ajax && ajax.readyState < 4)
【解决方案3】:

你可以使用setInterval

var xhr;
setInterval(
   function runAjax() {
        if(xhr) {
            xhr.abort();
        }
        xhr = $.ajax({
            url: "data.php"
        }).done(function(data) { 

        });
    }, 2000
)

像这样试试。

【讨论】:

  • 这实际上很糟糕:如果服务器开始变慢,许多请求将排队。
  • 我们可以通过xhr的abort方法取消排队的请求。
  • 是的,但它不在您的脚本的第一个版本中,是吗?
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2021-03-05
相关资源
最近更新 更多