2014-01-04 4 views
1
<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 с ajax звонки

Моя проблема: setTimeout будет отображать только первый вызов. И никогда не проверяет снова, если в базе данных есть другое изменение.

Я не знаю, является ли setTimeout правильным способом.

+0

Я думаю URL: 'http://127.0.0.1/ProgCsProg/main/countScoreCh' будет хорошо. Не нужно обертывать тег php. – sachinjain024

+0

Если никаких изменений в базе данных, каков код ответа сервера? – Daiwei

ответ

1

Вы делаете эти ошибки

  1. Если вы хотите опрашивать базу данных изменения, не использовать setTimeout. Вместо этого используйте setInterval и очистите этот интервал в зависимости от вашей логики, например, через 50 раз или что-то еще.
  2. Использовать busyFlag, потому что вы делаете звонок . (Как было предложено @ Mike)

Попробуйте

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

Теперь я понимаю, используя флаг .. но следуя вашему предложению .. он не будет отображать изменения..jst, как ничего не происходит. «if (! IS_BUSY_FETCHING_UPDATAES) = true;» (правописание), я не знаю, если вы сделал это специально. Я изменил, но вывод не будет отображаться. :( – Zurreal

+0

Я удалил тег PHP из URL-адреса. Нужно ли что-то делать? – sachinjain024

+0

Можете ли вы использовать хром-отладчик, чтобы узнать, получаете ли вы ответ или нет? 'Используйте console.log (response)' в готовом методе, чтобы узнать, что вы получаете. – sachinjain024

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); 
} 
+0

+1. Не используйте 'clearInterval', иначе он не будет выполнен в следующий раз. OP хочет слушать изменения базы данных каждый раз. – sachinjain024

+0

@blunderboy да, я начинал думать, что, возможно, это то, что он имел в виду, поэтому я добавил последнее предложение. – mike

+0

Нет, вы не можете заставить его работать, просто удалив еще часть. Учитывайте, когда есть ошибка, например, ошибка сети. Затем вы прекратите опрос изменений в базе данных. – sachinjain024

Смежные вопросы