使用setInterval的Ajax Heartbeat,同时防止多个调用

时间:2012-12-06 17:29:07

标签: jquery ajax delayed-execution heartbeat

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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

function poll() {
    setTimeout( function() {
        $.ajax(.......).success( function(data) {
            poll();  //call your function again after successfully calling the first time.
        });
    }, 10000);
}

答案 1 :(得分:6)

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

答案 2 :(得分: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