6

我希望在后台使用 jQuery 作为“心跳”进行 AJAX 调用,以便我的 Web 应用程序可以检查新数据。例如每 10 秒。

我在其他帖子上看到,可以用来setInterval()调用每 X 毫秒调用一次的方法。

但是,如果我的 AJAX 调用时间超过 10 秒会怎样?我仍然希望它完成最后一个请求,并且我不希望在已经有一个呼叫正在进行时再发起另一个呼叫。这可能导致相同的信息被放置在页面上两次!

当原始 AJAX 调用可能尚未完成时,我的方法等待原始 AJAX 调用完成,而不是简单地“每 10 秒”一次,实现这一点的方法是什么。

4

3 回答 3

11

尝试从您的 ajax 成功函数设置另一个超时:

function poll() {
    setTimeout( function() {
        $.ajax(.......).success( function(data) {
            poll();  //call your function again after successfully calling the first time.
        });
    }, 10000);
}
于 2012-12-06T17:34:31.093 回答
6

而不是使用setInterval,在 AJAX 完成回调中调用以在前一个调用完成setTimeout()后 10 秒开始每个调用。

于 2012-12-06T17:31:46.557 回答
0

而不是使用 setInterval,而是计算请求时间(通常使用以秒为单位的 unix 时间戳),10 秒的多少,在服务器端,使用setTimeout剩余时间,所以它会因用户而异,在他们的 ping 时间(或网站的业务)

function heartbeat(){
  $.ajax({
    'url': '/where/',
    'success': function(data){
       setTimeout(heartbeat, parseInt(data) * 1000);
    }
  });
}
heartbeat(); // initialize it

在服务器端,(就像在 PHP 中一样),你会做

<?php
// do your stuff
echo (time() - (int)$time_requested) + 10; // it will vary per user, so if it takes 2 second, it will be 12, if it returns imediately, returns 10 
于 2012-12-06T17:33:08.523 回答