如何在ajax请求中停止setTimeout

时间:2018-01-21 10:48:33

标签: javascript jquery ajax

它会在每次调用之间进行ajax调用,延迟时间为5秒。

如何在30秒后使用clearTimeout在ajax中停止此setTimeout?

$.ajax({
    url  : url,
    success : function(response){
         var Object = this;
         setTimeout(function(){     //How to stop this setTimeout
         $.ajax(Object);}, 5000)}   //using clearTimeout after 30 seconds?
          },
    });

3 个答案:

答案 0 :(得分:4)

首先,您正在做的事情被称为" 民意调查"技术。要做到这一点"正确的方式",最好使用递归函数,而不是:

var Object = this;
$.ajax(Object);

最好这样写:

function pollData() {
    $.ajax({
        url  : url,
        success : function(response){
            setTimeout(function() {
                pollData();
            }, 5000);
        }
}

接下来的问题是,如果你想因某种原因(例如3秒后)停止轮询怎么办? setTimeout会返回一个ID,稍后您可以将其用于clearTimeout

var pollingStatus = true;
var pollingTm = null;

function pollData() {
    $.ajax({
        url  : url,
        success : function(response){
            if (pollingStatus) {
                pollingTm = setTimeout(function() {
                    pollData();
                }, 5000);
            }
        }
}

function stopPolling() {
    pollingStatus = false;
    clearTimeout(pollingTm);
}

setTimeout(stopPolling, 3000);

答案 1 :(得分:1)

您可以设置obj_timeout = setTimeout(... 这样你就可以对范围外的对象进行引用

var obj_timeout = null; 
var stop_sending_loop = false;

$.ajax({ 
  url  : url,
  success : function(response){
     var Object = this;

     obj_timeout = setTimeout(function(){     //How to stop this setTimeout
          if(!stop_sending_loop)
            $.ajax(Object);
         }, 5000)
       }   //using clearTimeout after 30 seconds?
     },
});

var stop_to = function(){
   if(obj_timeout != null)
   clearTimeout(obj_timeout)
   stop_sending_loop = true;
}

setTimeout(stop_to,30000);

请参阅:https://www.w3schools.com/jsref/met_win_cleartimeout.asp

答案 2 :(得分:0)

将全局计数器变量声明为0成功外部函数。对于前者     var counter = 0;

成功功能, 设置你的setTimeout如下

var myVar = setTimeout(function(){
//How to stop this setTimeout
     counter++;
     $.ajax(Object);}, 5000)}   //using clearTimeout after 30 seconds?
      },

if (counter == 6) { clearTimeout(myVar);} // Since, 30/5 = 6

clearTimeout将停止setTimeout。和计数器确保在六次调用后触发clearTimeout。