2014-01-29 4 views
0

Я хочу прервать запрос через $.ajax(), но я продолжаю получать Uncaught TypeError: Object 5 has no method 'abort'. Число 5 меняется на 10 после еще одного нажатия, а затем, если вы нажмете еще несколько раз, он просто продолжает расти. Я использую следующий код:Uncaught TypeError: Object {number} не имеет метода 'abort'

var load_info = ''; 

$('body').on('click', '#moreinfo', function() { 
    load_info = setTimeout(function(){ 
     $.ajax({ 
      url:'file.php', 
      method:"GET", 
      success:function(s){ alert(s); }, 
      error:function(e){ alert(e); } 
     }) 
    },2000); 
}); 

$('body').on('click', '#cancel', function() { 
    load_info.abort(); 
}); 

Demo at jsFiddle (довести до консоли браузера, чтобы увидеть ошибку)

Как я могу сделать эту функцию работать?

ответ

0

Как говорится в ошибке, номера не имеют метода abort. Ваш load_info - это номер, дескриптор возвращается setTimeout. Это не объект XHR или jqXHR.

Если вы хотите отменить таймер (предотвратить АЯКС запрос от того начал), использование:

clearTimeout(load_info); 

Если вы хотите, чтобы отменить АЯКС вызов в незавершенном после запуска, вы должны будете получить объект XHR от ajax, а затем вызвать abort на ней, как это:

var loading_xhr = null; 

$('body').on('click', '#moreinfo', function() { 
    setTimeout(function(){ 
     loading_xhr = $.ajax({ 
      url:'file.php', 
      method:"GET", 
      success:function(s){ alert(s); }, 
      error:function(e){ alert(e); }, 
      complete:function(){ 
       // Be sure to clear it again here 
       loading_xhr = null; 
      }; 
     }) 
    },2000); 
}); 

$('body').on('click', '#cancel', function() { 
    if (loading_xhr) { 
     loading_xhr.abort(); 
     loading_xhr = null; 
    } 
}); 
+0

Спасибо :) Есть 'clearTimeout()' и 'прервать()' то же самое, но ' clearTimeout() 'просто отменяет' setTimeout() '? – Erik

+0

@ErikEdgren: 'clearTimeout' и' abort' не связаны. 'clearTimout' очищает запланированный таймер. Если вы вызовете его до срабатывания таймера, функция, которую вы запланировали, не будет запущена. В этом случае это означает, что вы никогда не назовете '$ .ajax'. 'abort' предназначен для прерывания выполняемых XHR-запросов. –

+0

Хорошо. Большое спасибо. Я приму свой ответ, как только смогу – Erik

0

setTimeout() возвращает номер:

the numerical ID of the timeout, which can be used later with window.clearTimeout().

>>> var x = window.setTimeout(function(){}, 1000) 
undefined 
>>> x 
102 
>>> typeof x 
"number" 

Я подозреваю, что вы хотите, что документация предполагает:

window.clearTimeout(load_info);