2016-12-08 2 views
0

В разделе beforeSend я добавил setTimeout. Если ajax занимает более 20 секунд, появляется сообщение о тайм-ауте. Если ajax достигает успеха до 20 секунд, setTimeout все еще работает и появляется сообщение о тайм-ауте.Как остановить setTimeout на успех?

Как предотвратить появление сообщения о тайм-ауте, если ajax завершается менее чем за 20 секунд?

форма

<?= $form->field($relasi, 'npsn')->textInput(['class' => 'form-control', 'id' => 'npsn', 'onkeyup' => 'sendFirstCategory(this.value)', 'autocomplete' => 'off'])->label(false); ?> 

JavaScript

function sendFirstCategory(npsn) 
{ 
    var test = npsn; 
    var timeoutvar = null; 

    $.ajax({ 
     url: '<?php echo \Yii::$app->getUrlManager()->createUrl('keranjang/isi-data-ajax') ?>', 
     type: 'POST', 
     data: { test: test }, 
     beforeSend:function() 
     { 
      $('#hokya').show(); 
      $('#hokya').html('<img src="../img/Preloader_1.gif" alt="Loading..." />'); 

      var a = ""; 

      $('form [id=nm_sekolah]').val(a); 
      $('form [id=email]').val(a); 
      $('form [id=telp]').val(a); 
      $('form [id=alamat]').val(a); 
      $('form [id=penanggung_jawab]').val(a); 

      timeoutvar = setTimeout(function() { 
       $("#hokya").hide(); 
       $('#login-modal').modal('show'); 
       $('form [id=nm_sekolah]').val(a); 
       $('form [id=email]').val(a); 
       $('form [id=telp]').val(a); 
       $('form [id=alamat]').val(a); 
       $('form [id=penanggung_jawab]').val(a); 
      }, 20000); 
     }, 
     success: function(data) 
     { 

      clearTimeout(timeoutvar); 
      var o = $.parseJSON(data); 

      $.each(o, function(key, value){ 
       $('form [id=' + key + ']').val(value); 
      }); 

      $('#hokya').hide(); 
     } 
    }); 
} 
+3

Вы пробовали 'clearTimeout (timeout)'? – NewToJS

+0

* «Если [success] я объявляю clearTimeout там, setTimeout все еще работает» * - Пожалуйста, отредактируйте свой вопрос, чтобы показать код, который не работает, где у вас был 'clearTimeout()' в вашем обработчике успеха. И как в стороне, почему вы используете селекторы типа '' form [id = nm_sekolah] ''? Почему не просто '' # nm_sekolah''? – nnnnnn

+0

oops, мой плохой. Я редактировал его. '' form [id = nm_sekolah] ''просто отлично работает .. @nnnnnn –

ответ

0

Я думаю, вы можете написать функцию обратного вызова ошибки, и проверьте, является ли статус timeout.of Конечно, вам необходимо установить тайм-аут: 20 тоже.

Аякса апи из JQuery:

ошибка Тип: Функция (jqXHR jqXHR, String textStatus, String errorThrown) Функция, которая вызывается, если запрос не удается. Функция получает три аргумента: объект jqXHR (в jQuery 1.4.x, XMLHttpRequest), строка, описывающая тип возникшей ошибки и необязательный объект исключения, если это произошло. Возможные значения для второго аргумента (кроме нуля) - это «тайм-аут», «ошибка», «прервать» и «parsererror». При возникновении ошибки HTTP errorThrown получает текстовую часть статуса HTTP, например «Not Found» или «Internal Server Error». Начиная с jQuery 1.5, параметр ошибки может принимать массив функций. Каждая функция будет вызываться по очереди. Примечание. Этот обработчик не вызывается для междоменного скрипта и междоменных запросов JSONP. Это событие Ajax.

function sendFirstCategory(npsn){ 
var test = npsn; 
$.ajax({ 
    url: '<?php echo \Yii::$app->getUrlManager()->createUrl('keranjang/isi-data-ajax') ?>', 
    type: 'POST', 
    data: { test: test }, 
    beforeSend:function() 
    { 
     $('#hokya').show(); 
     $('#hokya').html('<img src="../img/Preloader_1.gif" alt="Loading..." />'); 

     var a = ""; 

     $('form [id=nm_sekolah]').val(a); 
     $('form [id=email]').val(a); 
     $('form [id=telp]').val(a); 
     $('form [id=alamat]').val(a); 
     $('form [id=penanggung_jawab]').val(a); 
    }, 
    timeout:200000, 
    success: function(data) 
    { 
     var o = $.parseJSON(data); 

     $.each(o, function(key, value){ 
      $('form [id=' + key + ']').val(value); 
     }); 

     $('#hokya').hide(); 
    }, 
    error:function(jqXHR,textStatus) 
    { 
     if (textStatus=='timeout') { 
      var a = ""; 
      $("#hokya").hide(); 
      $('#login-modal').modal('show'); 
      $('form [id=nm_sekolah]').val(a); 
      $('form [id=email]').val(a); 
      $('form [id=telp]').val(a); 
      $('form [id=alamat]').val(a); 
      $('form [id=penanggung_jawab]').val(a); 
     } 
    } 

}); }

+0

Можете ли вы привести пример в мой код, пожалуйста. @jam mok –

0

Оператор timeout = setTimeout(...) присваивает идентификатор тайм-аута глобальной переменной с именем timeout. В вашем clearTimeout(timeoutvar); используется различный переменная, timeoutvar.

Изменить timeouttimeoutvar.

+0

Я отредактировал его в своем коде и все равно даю мне тот же результат –

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