在jquery中中止所有先前的请求

时间:2016-03-22 07:22:39

标签: javascript jquery ajax

我的应用程序中有一个搜索框。我必须在用户在搜索框中键入单词时显示结果。为此,我需要中止所有先前的请求,并在网格中显示最后一个请求的结果。

因为我正在使用网格,所以网格“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 个答案:

答案 0 :(得分:1)

  

我必须在用户在搜索框中输入单词时显示结果。对于,我需要中止以前的所有请求在网格中显示上次请求的结果

您的代码:

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

无法执行任何操作,因为仅当请求获得completesuccess的响应时,此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);

  });

})