очистить один тайм-аут, начать другой - PullRequest
3 голосов
/ 24 октября 2011

Я автоматически обновляю контент на сайте, используя ajax / json. Используя jkey, я запускаю некоторую публикацию в документе, и во время этого действия я хочу отменить исходный запущенный setTimeout («перезагрузка» через 2 минуты) - и затем снова запустить всю функцию «content», чтобы начать снова через 5 секунд. Тем не менее, я не могу перестать правильно «перезагружать», ни вызывать «контент» через заданные секунды. Кто-нибудь может определить ошибку?

 <script>
$(function content(){
  function reloading(){
      $.ajax({                                      
      url: 'api.php',                          
      data: "",                      
      dataType: 'json',                    
      success: function(data)          
      {
        var id = data[0];              
          _id = id;
        var vname = data[1];           
        var message = data[2]; 
        var timestamp = data[3]; 
        var field1 = data[4]; 
        _field1 = field1;
        var val2 = parseInt(field1, 10) ;
        _val2 = val2;
        $('#output').hide().html( message ).fadeIn("slow");   
         $('#username').hide().html( vname +":" ).fadeIn("slow");
      setTimeout(reloading,120000);
 }
      });
  }
  reloading();
}); 

  $(document).jkey('a',function() {
     $.post("update.php", { "id": _id} )
      $('#output').hide().html( "<i>thx" ).fadeIn("slow");
      $('#username').fadeOut("fast");
      $('#valg1').fadeOut("fast");
      $('#valg2').fadeOut("fast");
        clearTimeout(reloading);
       setTimeout(content,5000);
      });
</script>

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

clearTimeout должен получить уникальный "ключ", который возвращается setTimeout. Поэтому при установке присвойте возвращаемое значение глобальной переменной:

window["reload_timer"] = setTimeout(reloading,120000);

Тогда имейте это:

clearTimeout(window["reload_timer"]);
3 голосов
/ 24 октября 2011

Вы должны сохранить идентификатор setTimeout(), чтобы позже очистить его с помощью clearTimeout().Как это:

var timeoutID = setTimeout(function(){someFunction()}, 5000);//this will set time out
//do stuff here ...
clearTimeout(timeoutID);//this will clear the timeout - you must pass the timeoutID
0 голосов
/ 24 октября 2011

Помимо сохранения идентификатора тайм-аута, как упомянуто в других сообщениях, ваш function reloading создается внутри function content, и, поскольку вы не закрываете его, он недоступен для остальной части программы.

$(function content(){
    function reloading(){
        console.log('RELOADING');
    }
    reloading();
}); 

// Can't reach `content` or `reloading` from here

Вы должны сделать что-то вроде этого:

var reloading, content, reloadingTimeoutId, contentTimeoutId;


reloading = function () {
    console.log('RELOADING');
    $.ajax(
       // CODE
       success : function (data) {
           // CODE
           reloadingTimeoutId = setTimeout(reloading, 120000);
       }
    )
};


content = function () {
    reloading();
};


$(document).jkey('a',function() {
    // CODE
    clearTimeout(contentTimeoutId);
    contentTimeoutId = setTimeout(content,5000);
});

Трудно написать это лучше, не зная общую картину.При этом content будет вызываться через 5 секунд, и до тех пор, пока reloading будет успешным, он будет вызывать сам себя каждые 120 секунд.Обратите внимание, что reloading никогда не очищается таким образом.

...