带有ajax调用的setTimeout

时间:2014-01-04 03:30:23

标签: javascript ajax

<script type="text/javascript">
   var timeOutID = 0;
   var checkScores = function() {
     $.ajax({
       url: "<?php echo 'http://127.0.0.1/ProgVsProg/main/countScoreCh'?>",
       success:function(response){
       if (response !=' ') {
         $('#scoreCh').html(response);
         clearTimeout(timeOutID);
       } else{
         timeOutID = setTimeout(checkScores, 3000);
       }
     });
   }
   timeOutID = setTimeout(checkScores,1000);
 </script>

如果数据库中有更改,我正在使用setTimeout。如果有变化..将输出更改。

我的问题是setTimeout只会显示第一个调用。如果数据库中有其他更改,则永远不会再次检查。

我不知道setTimeout是否是正确的做法。

2 个答案:

答案 0 :(得分:2)

是的,setTimeout只运行一次。你正在寻找setInterval。

<script type="text/javascript">
    var timeOutID = 0;
    var checkScores = function() {
        $.ajax({
            url: "<?php echo 'http://127.0.0.1/ProgVsProg/main/countScoreCh'?>",
            success: function(response) {
                if(response !== '') {
                    $('#scoreCh').html(response);
                }
            }
        });
    };
    timeOutID = setInterval(checkScores, 1000);
</script>

您也可以通过在成功函数中删除其他内容来实现它:

success: function(response) {
    if(response !== '') {
        $('#scoreCh').html(response);
    }
    timeOutID = setTimeout(checkScores, 3000);
},
error: function() {
    timeOutID = setTimeout(checkScores, 3000);
}

答案 1 :(得分:1)

你犯了这些错误

  1. 如果要轮询数据库更改,请不要使用setTimeout。而是使用setInterval并根据您的逻辑清除此间隔,例如在50次或其他之后。
  2. 使用busyFlag,因为您正在进行asynchronous通话。 (正如@mike所建议的那样)
  3. 试试这个

    var intervalId = null;
    var IS_BUSY_FETCHING_UPDATES = false;
    
    var checkScores = function() {
      if (!IS_BUSY_FETCHING_UPDTAES) {
        IS_BUSY_FETCHING_UPDTAES = true;
    
        $.ajax({
          url: "http://127.0.0.1/ProgVsProg/main/countScoreCh" 
        }).done(function(response){
          if (response) {
            $('#scoreCh').html(response);
          }
        }).fail(function(e) {
          console.error(e);
        }).always(function() {
          IS_BUSY_FETCHING_UPDATES = false; // This will be executed when AJAX gets complete
        });
    }
    
    intervalID = setInterval(checkScores,1000);