循环中的jquery setTimout只是继续启动

时间:2015-05-22 11:34:08

标签: jquery ajax loops settimeout

我有一个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>

3 个答案:

答案 0 :(得分:3)

尝试在函数(){}

中包装$ .ajax()调用
setTimeout(function(){ $.ajax({ ... })}, 5000);

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

如果您希望代码在页面打开时每5秒运行一次,那么最好使用setInterval。如果要使用一次代码,则只能使用setTimeout。如果你想要在一些变量变为真/假的情况下打破你的间隔,那么你可以使用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);

});