2016-03-22 3 views
3

У меня есть окно поиска в моем приложении. В котором я должен показывать результаты, пока пользователь вводит слово в поле поиска. Для этого мне нужно отменить все предыдущие запросы и показать результат последнего запроса в сетке.Отменить все предыдущие запросы в jquery

Потому что я использую сетку, сетка «beforeSend» событие переопределит событие jquery beforeSend. Поэтому я использовал ниже код,

<script type="text/javascript"> 
$(function() { 
    $.xhrPool = []; 
    grid.Adaptor.prototype.beforeSend = function (jqXHR) { 
     $.xhrPool.push(jqXHR); 
    } 
    $.xhrPool.abortAll = function() { 
     $(this).each(function (i, jqXHR) { 
      jqXHR.abort(); 
      $.xhrPool.splice(i, 1); 
     }); 
    } 
    $.ajaxSetup({ 
     complete: function (jqXHR) { 
      var i = $.xhrPool.indexOf(jqXHR); 
      if (i > -1) $.xhrPool.splice(i, 1); 
     } 
    }); 
}) 

Однако, я могу нажать на запрос в xhrPool, но я не могу отменить предыдущие запросы.

Примечание $.xhrPool.abortAll = function() { Это не касается, когда я устанавливаю точку останова.

Что мне здесь не хватает?

+1

Вы добавляете метод к объекту массива. Что заставляет вас думать, что интерпретатор JavaScript сам вызовет этот метод? – undefined

+0

http://stackoverflow.com/a/8841412/1982680 попробуйте это и http://jsfiddle.net/s4pbn/148/ –

+0

Где код для вызова '$ .xhrPool.abortAll'? –

ответ

1

Мне нужно показать результаты, пока пользователь вводит слово в поле поиска. Для этого Мне нужно отменить все предыдущие запросы и показать результат последнего запроса в сетке.

Ваш код:

$.ajaxSetup({ 
    complete: function (jqXHR) { 
     var i = $.xhrPool.indexOf(jqXHR); 
     if (i > -1) $.xhrPool.splice(i, 1); 
    } 
}); 

ничего как этого complete обратного вызова пожаров только тогда, когда запрос получил ответ как success или error не будет делать. Итак, прерывание здесь не имеет смысла.

Я хотел бы предложить вам использовать синхронизированную setTimeout() в сочетании с clearTimeout():

$(function() { 
    var time; 

    $('input').keydown(function(e){ 

    if(time){ 
     // before hitting the ajax 
     // clear the timeout if there is/are 
     clearTimeout(time); 
    } 

    time = setTimeout(function(){ 
     // here put the ajax code. 
    },600); 

    }); 

}) 
+0

Это работает, когда я добавляю функцию setTimeOut. Мне нужно подтвердить, что я не могу прервать предыдущие запросы ajax в ajaxSetup? – Shesha

+0

Вы можете сделать это с помощью 'beforeSend: callback'. – Jai

+0

ok fine jai. Я использую сетку так, ajaxsetup beforeSend не будет работать для меня. Спасибо за решение. :) :) – Shesha

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