jquery 循环中的 setTimeout 一直在启动

jquery setTimout in loop just keeps launching

我有一个 Ajax 请求,我想每 5 秒启动一次以查看进程是否已完成。为此,我尝试使用 setTimout(),但它只是在不考虑超时的情况下一个接一个地启动一个进程。我已经在 SO 上阅读了多个关于此的问题并尝试实现答案,但是我无法让它工作。我必须更改什么才能使其正常工作?

<script type="text/javascript">
$(function() {

$(document).ready(function() {
  var user = $('.user-id').text()
  var url = '/ajaxurl'
  var success = 0
  var time = 0
  var dataString = 'email='+user;
  checkServer(url,user,time,success,dataString);
});

function checkServer(url, user, time, success, dataString) {
    setTimeout(     
      $.ajax({
        type: "POST",
        url: url,
        data: dataString,
        success: function(data) {
          if (data == 'True') {
            success = 1
            window.location = "https://www.someurl.com";
          }
          else {
            time++
            console.log(time);
            console.log(data);
            if ((success == 0) && (time < 60)) {
              checkServer(url, user, time, success, dataString)
            }
          }
        }
      }), 5000);
};
});
</script>

除了@Taplar 的回答之外,我还建议您在创建新超时计时器之前清除超时计时器:

var myTimer = null;
function checkServer(url, user, time, success, dataString) {
    clearTimeout( myTimer );
    myTimer = setTimeout( 
...

否则你将不会总是有 5 秒的延迟,例如 ajax 将比之前的超时回调执行得更快。

尝试将您的 $.ajax() 调用包装在一个函数中 (){}

setTimeout(function(){ $.ajax({ ... })}, 5000);

否则会在编译时立即触发。

如果您希望您的代码在页面打开时每 5 秒 运行,您最好使用 setInterval。如果您想使用一次代码,则只能使用 setTimeout。如果你想在某个变量变成 true/false 时打破间隔,那么你可以使用 clearInterval

对于您的代码:

function checkServer(url, user, time, success, dataString) {
      $.ajax({
        type: "POST",
        url: url,
        data: dataString,
        success: function(data) {
          if (data == 'True') {
            success = 1
            window.location = "https://www.someurl.com";
          }
          else {
            time++
            console.log(time);
            console.log(data);
            // DEFINE A NOT SUCCESS HERE!
            if (false) {
                clearInterval(intVal);
            }
          }
        }
      });
};
$(document).ready(function() {
  var user = $('.user-id').text()
  var url = '/ajaxurl'
  var success = 0
  var time = 0
  var dataString = 'email='+user;

  var intVal = setInterval(function(){
      checkServer(url,user,time,success,dataString);
  }, 5000);

});