2016-04-14 2 views
0

У меня есть запрос AJAX, который выглядит следующим образом:Убейте запрос повторяющегося AJAX

var statistics = "link-to-a-JSONP"; 

function team_stats(json) { 
    alert(json); 
} 

(function stats() { 
     $.ajax({ 
      type: 'GET', 
      url: statistics + '?callback=jsonp', 
      crossDomain: true, 
      dataType: 'jsonp', 
      jsonpCallback: 'team_stats', 
      jsonp: 'callback', 
      data: {}, 
      success: function(data) { 
       var test += '<div>' + data + '</div>'; 
       $(".content").append(test); 

       /* a close button that closes the tab and kills the request */ 
       $("#closeStats").on("click", function() { 
        stats.abort(); 
       }); 
      }, 
      complete: function() { 
       setTimeout(stats, 15000); 
      } 
     }); 
})(); 

Это прекрасно работает, и запрос повторяется каждые 15 секунд. Теперь я хочу убить запрос, когда я нажимаю определенную кнопку (как показано). Компилятор говорит, что параметр stats.abort() не является функцией и продолжает цикл.

Любые идеи?

+0

Я предполагаю, что у вас есть stats.abort(), определенная где-то. Попробуйте переместить код для привязки события click к #closeStats вне функции статистики. Я уверен, что вы только хотите присоединить это один раз (не каждый раз, когда вызов ajax успешно завершен) и должен предоставить ему доступ к правильному контенту для stats.abort(). –

+0

Что такое «статистика»? Если НИЧЕГО не связано с вызовом Ajax, это функция. – epascarello

+0

stats - это имя функции, которая определяет мой запрос AJAX. Он успешно вызван изнутри, установив его как часть setTimeout, поэтому я не понимаю, почему его нельзя назвать внутренним успехом. – webbul

ответ

3

Вы вызываете прерывание по функции. Функции не прерываются.

Вы хотите убить setTimeout. Поэтому вам нужно держать ссылку на таймер.

(function() { 
    var timer; 
    function foo() { 
     console.log(new Date()); 
     timer = window.setTimeout(foo,1000); //<-- store a reference to the timeout 
    } 

    function killTimer() { 
     if (timer) window.clearTimeout(timer); 
    } 

}()); 

Если вы хотите также прервать активный запрос Ajax, вам также необходимо указать ссылку на него.

xhr = $.ajax(...); 
... 
xhr.abort(); 
+0

Это абсолютно правильно! Я знал, что делаю что-то неправильно. Так что мне нужно убить тайм-аут вместо этого ... Большое спасибо :) – webbul

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