繁体   English   中英

如何在ajax请求中停止setTimeout

[英]How to stop setTimeout inside ajax request

它进行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?
          },
    });

首先,您正在做的事情称为“ 轮询 ”技术。 为了做到“正确”,最好使用递归函数,而不是:

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);

您可以设置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

将外部计数器函数的全局计数器变量声明为0。 对于ex 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM