Вопрос по jquery, javascript – Как я могу остановить эту функцию setTimeout от запуска?

4

Я использую функцию ниже, чтобы проверить состояние файла JSON. Он запускается каждые 8 секунд (используя setTimeout), чтобы проверить, изменился ли файл. Как только JSON-статус становится «успешным» Я больше не хочу продолжать вызывать функцию. Может кто-нибудь, пожалуйста, покажите мне, как это сделать? Я подозреваю, что это связано с использованием clearTimeout, но я не уверен, как это реализовать.

Ура!

<code>  $(function() {
    var checkBookStatus = function() {
       var job_id = "#{@job.job_id}";
       var msg = $('.msg');
       var msgBuilding = $('#msg-building');
       var msgQueuing = $('#msg-in-queue');
       var msgSuccessful = $('#msg-successful-build');
       var msgError = $('#msg-error'); 
       $.ajax({ 
         url: '/jobs/'+job_id+'/status.json',

           datatype: 'JSON',
           success:function(data){
             if (data.status == "failure")  {
               msg.hide();          
               msgError.show();
             }
             else if (data.status == "#{Job.queue}")  {
            msg.hide();          
            msgQueuing.show();
         }
             else if (data.status == "#{Job.building}")  {
            msg.hide();          
            msgBuilding.show();
         }             
         else if (data.status == "#{Job.failure}")  {
             msg.hide();          
             msgError.show();
         }
         else if (data.status == "#{Job.success}")  {
             msg.hide();          
             msgSuccessful.show();

              }                    
           },       
       }).always(function () {
            setTimeout(checkBookStatus, 8000);
      });
    };    
   checkBookStatus();    
  });
</code>

Ваш Ответ

6   ответов
0

следующее должно работать ...

функция setTimeout возвращает экземпляр функции setTimeout. Сохраните это значение в переменной и передайте его функции clearTimeout, если вы хотите предотвратить повторное запуск события.

то есть

    var t = setTimeout(1000, someFunction);
...

//after you no longer need the timeout to fire, call

clearTimeout(t);
4

clearTimeout

например вы определили:

id = setTimeout(checkBookStatus, 8000);  

тогда вы можете удалить эту функцию:

clearTimeout(id)
5

t = setTimeout(checkBookStatus, 8000); когда вы решите остановить тайм-аут, используйте этоclearTimeout(t);.

тайм-аут вызовет функцию checkBookStatus, очистка должна быть внутри функции checkBookStatus, очевидно, что очистка для тайм-аута не произойдет, если только функция не называется "уже вызвана", зачем он запрашивает ее остановку, если она " Вы еще не звонили?
always() Функция установит новый, другой тайм-аут, хотя. В этом проблема. Поскольку код в настоящее время не существует, нет способа узнать, чтобы очистить тайм-аут.
Как вы можете очистить тайм-аут, который еще не был установлен?
@LeeKowalkowski ты заставил меня думать об этом снова и снова, чувак! когда он сначала вызовет функцию, а затем за ее пределами будет создана и доступна функция var t, после того, как первый вызов setTimeout будет запущен, так что снаружи он может рассчитывать, затем использовать clearTimeout (t), и это будет допустимо после первого вызова. конечно.
убедитесь, что этоt = setTimeout(...) не<b>var<b> t = setTimeout(...) t должен быть установлен как глобальная переменная.
2

До вашего вызоваcheckBookStatus() в конце сделайте еще один звонок:var interval = setInterval(checkBookStatus, 8000);, Тогда на успехе вы можетеclearInterval(interval).

Не использоватьsetTimeout для итерации.

Многие ответы предлагают просто использоватьclearTimeout() однако, вы проверяете статус после истечения времени ожидания, время для сброса отсутствует. Вам не нужно звонитьsetTimeout() в вашемalways() функция, а не очистить что-либо. Таким образом, вы можете повторно проверить статус внутри вашегоalways() функция, я полагаю, но вашdata объект не находится там в области видимости. Было бы предпочтительнее просто использоватьsetInterval() outside вашейcheckBookStatus() функция.

$(function() {
    var checkBookStatus = function() {
        var job_id = "#{@job.job_id}";
        var msg = $('.msg');
        var msgBuilding = $('#msg-building');
        var msgQueuing = $('#msg-in-queue');
        var msgSuccessful = $('#msg-successful-build');
        var msgError = $('#msg-error'); 
        $.ajax({ 
            url: '/jobs/'+job_id+'/status.json',
            datatype: 'JSON',
            success:function(data){
                if (data.status == "failure")  {
                    msg.hide();          
                    msgError.show();
                }
                else if (data.status == "#{Job.queue}")  {
                    msg.hide();          
                    msgQueuing.show();
                }
                else if (data.status == "#{Job.building}")  {
                    msg.hide();          
                    msgBuilding.show();
                }             
                else if (data.status == "#{Job.failure}")  {
                    msg.hide();          
                    msgError.show();
                }
                else if (data.status == "#{Job.success}")  {
                    msg.hide();          
                    msgSuccessful.show();
                    clearInterval(interval);
                }                    
            }       
        });
    };    
    var interval = setInterval(checkBookStatus, 8000);    
    checkBookStatus();
});
Error: User Rate Limit Exceeded swisstony
2

Когда вы используетеsetTimeout, используйте как это:

var myTime = setTimeout(checkBookStatus, 8000);

очистить это просто:

clearTimeout(myTime);
2

ВызовclearTimeout со значением, ранее возвращеннымsetTimeout, Это даст вам что-то вроде:

$(function() {
  var timeoutID;
  var checkBookStatus = function () {
      […]
      else if (data.status == "#{Job.success}")  {
          clearTimeout(timeoutID);
      […]
       }).always(function () {
        timeoutID = setTimeout(checkBookStatus, 8000);
      […]

Похожие вопросы