Javascript jQuery:每X秒运行一次AJAX,只运行60秒?

Javascript jQuery:每X秒运行一次AJAX,只运行60秒?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在尝试运行AJAX,比如说每5秒运行一次,然后在60秒后停止整个AJAX调用,这样在达到60秒后就不会有任何AJAX调用 我不确定这是否可能 我可以轻松地每5秒运行一次ajax,如下所示: setInterval(function(){ $.ajax({url: 'PHP-PAGE.php', success: function(result){ }}); }, 5000); 有没有办法在ajax中开始60秒倒计时,并在达到60秒后停止整个ajax调用

我正在尝试运行AJAX,比如说每5秒运行一次,然后在60秒后停止整个AJAX调用,这样在达到60秒后就不会有任何AJAX调用

我不确定这是否可能

我可以轻松地每5秒运行一次ajax,如下所示:

    setInterval(function(){ 

 $.ajax({url: 'PHP-PAGE.php', success: function(result){

    }});

     }, 5000);
有没有办法在ajax中开始60秒倒计时,并在达到60秒后停止整个ajax调用

任何帮助都将不胜感激。

请检查以下代码:)

for(变量i=1;i<61;i++){
setTimeout(函数(){
console.log(“#afuctionatrunseverysecondinoneminute”)
},1000*i);
}

从设置的时间间隔捕获进程id

var intervalID = setInterval(..., 5000)
然后立即设置一个超时,该超时将在60秒内取消间隔

setTimeout(function(){clearInterval(intervalID)},60000)

你应该加上时间计数器

var timeCounter= 0;
然后在
setInterval
调用中检查它是否高于60秒

var interval = setInterval(function() {
    timeCounter += 5;
    if (timeCounter > 60) {
        clearInterval(interval);

    } else {
        $.ajax({url: 'PHP-PAGE.php', success: function(result){

        }});
    }
}, 5000);

通常,在
setInterval
函数中执行异步调用是一种不好的做法。相反,您可以在超时后从其回调执行相同的函数:

示例

检查此项以获得一个工作示例


编辑(添加响应时间计算)

//启动计数器
var i=0;
var start=setInterval(函数(){i++;},1000);
var ajaxCall=函数(){
//设置开始时间
var startAjaxRequest=new Date().getTime();
//执行ajax调用
$.ajax({url:'PHP-PAGE.PHP',success:function(result){
//以毫秒为单位获取ajax响应时间
var ajaxResponseTime=new Date().getTime()-startAjaxRequest;
如果(i<60&&ajaxResponseTime<5000){
//在5秒减去ajax响应时间后执行相同的ajax调用
设置超时(ajaxCall,5000-ajaxResponseTime);
}否则{
清除间隔(开始);
}
}});
}

我找到了一个最简单的方法。可能对您有帮助:

$(函数(){
var-tick=1;
setInterval(函数(){


如果(勾选请重新格式化您的代码-除此之外,我认为这是一个比(当前)更好的解决方案投票率较高的一个,因为它考虑了真实时间,而
setInterval
有时不考虑这种情况。@Alnitak您能详细说明一下您认为是什么让它更好吗?我不确定我是否理解您的观点,因为这两种解决方案都使用
setInterval
触发Ajax。@clockjuice
setInterval
事件可能会结束排队(例如,如果浏览器忙),然后一次释放所有事件。根据经过的时间进行检查可确保“60秒后无任何事情发生”的主要约束如果在
setInterval
事件排队时调用
clearInterval
,您知道队列是被清除还是被执行吗?@code>它将被清除我认为这是低效的,而且占用大量内存,因为您要求浏览器一次跟踪60个进程,而1或2可以用来解决问题e问题在我的计算机中为0.724毫秒browser@Guti即便如此,这也不好practise@Alnitak,是的,你是对的。但有时它很方便:)不,它不方便,这是一个有趣的解决方案。
timeCounter
增量不应该在开始时出现吗?事实上,当时间流逝为65秒时,检查
if(timeCounter>60)
将失败,因为计数器将等于60(来自上一次函数调用)。对不起:)我同意在循环中使用
setTimeout
而不是
setInterval
,但为什么要使用单独的计数器来测量经过的时间?!p.s.您也应该使用
setTimeout(ajaxCall,5000)
如果没有额外的匿名函数包装器,这不符合OP的要求“我正在尝试运行AJAX,比如说每5秒运行一次”。此解决方案中的Ajax调用不是按可预测的计划触发的。顺便说一句,我很感兴趣。为什么在
setInterval
内执行异步调用是一种不好的做法?因为,当调用异步函数时,您无法确定响应时间。如果响应在更短的时间内返回,则下一个异步caLH,没关系,但从另一方面来说,下一个异步调用将在上一个响应可用之前执行。我明白了。我想这取决于需求。如果OP用确切的术语说明了问题(意味着应该每5秒触发一次请求)那么这个解决方案就不起作用了。另一方面,如果OP希望下一个请求在收到最后一个请求后5秒发出,这就更好了。只要稍加努力,OP甚至可以通过使用一个额外的标志来获得两个世界的最佳效果:每5秒触发一次,但如果最后一个结果还没有出现,则跳过。感谢您的解释有趣。我不确定它是否满足其中一个要求。OP写道:“在我们达到60秒后,将不会有任何ajax调用。”通过增加
onSuccess
回调中的
勾号
,您将失去对勾号是否实际保持时间的控制。如果触发的呼叫在55秒左右需要一段时间才能响应,5秒过去,它将无法及时增加
勾号
,并且在60秒之后将发出另一个呼叫limit@BeetleJuice是的,我有同意你的观点。如果OP不想在第60秒后执行任何ajax调用,那么这个方法对OP没有帮助。如果OP想发出12个ajax请求,即
12*5=60
s,那么他可以使用这个。投票人应该留下一条评论,说明为什么答案被否决。我同意。我认为堆栈应该需要一条带有每次否决票(当话题被搁置时,同样的理由是必需的),即使这些评论与此评论线索分开显示。这将有助于人们写出更好的答案。关于这一点的讨论进行得很好
var timeCounter= 0;
var interval = setInterval(function() {
    timeCounter += 5;
    if (timeCounter > 60) {
        clearInterval(interval);

    } else {
        $.ajax({url: 'PHP-PAGE.php', success: function(result){

        }});
    }
}, 5000);
// Start a counter
var i = 0;
var start = setInterval(function() { i++; }, 1000);

var ajaxCall = function() {

   // Set the start time
   var startAjaxRequest = new Date().getTime();

   // Execute ajax call
   $.ajax({url: 'PHP-PAGE.php', success: function(result){

      // Get the ajax response time in ms
      var ajaxResponseTime = new Date().getTime() - startAjaxRequest;

      if (i < 60 && ajaxResponseTime < 5000) {

         // Execute the same ajax call after 5 seconds minus ajax response time
         setTimeout(ajaxCall, 5000 - ajaxResponseTime);

      } else {

         clearInterval(start);

      }
   }});
}