对新请求中止先前的ajax请求


77

我有一个函数,在输入更改时运行ajax调用。

但是,有可能在上一个ajax调用完成之前再次触发该函数。

我的问题是,在开始新的ajax调用之前,我将如何中止它?不使用全局变量。(在这里查看类似问题的答案)

我当前代码的jsfiddle

Javascript:

var filterCandidates = function(form){
    //Previous request needs to be aborted.
    var request = $.ajax({
        type: 'POST',
        url: '/echo/json/',
        data: {
            json: JSON.stringify({
                count: 1
            })
        },
        success: function(data){
            if(typeof data !== 'undefined'){
                jQuery('.count').text(data.count)
                console.log(data.count);
            }
        }
    });
};

if(jQuery('#search').length > 0){
    var form = jQuery('#search');
    jQuery(form).find(':input').change(function() {
        filterCandidates(form);
    });
    filterCandidates(form);
}

HTML:

<form id="search" name="search">
    <input name="test" type="text" />
    <input name="testtwo" type="text" />
</form>
<span class="count"></span>

您的问题标题是错误的,应该在完成上一个请求之前中止新的AJAX请求
Abhishek Kamal,

Answers:


109
 var currentRequest = null;    

currentRequest = jQuery.ajax({
    type: 'POST',
    data: 'value=' + text,
    url: 'AJAX_URL',
    beforeSend : function()    {           
        if(currentRequest != null) {
            currentRequest.abort();
        }
    },
    success: function(data) {
        // Success
    },
    error:function(e){
      // Error
    }
});

12
两个响应处理程序(successerror)是否都应设置currentRequestnull
CodeManX

3
OP问how would I abort the previous ajax call。但是在这里,您正在中止tihe currentRequest,这是较新的版本。因此,前一个将执行,新请求将被中止。对?
phil294

10
啊,不。将对象分配给之前beforeSend执行。因此,先前的呼叫在那里被中止。-总是欣赏评论很好的答案jqXHRcurrentRequest
phil294 '16

5
该解决方案不适用于GET类型。未通过POST检查。
Sanyam Jain

4
尽管此代码可以回答问题,但提供有关如何以及为什么解决问题的其他上下文将提高答案的长期价值。
亚历山大

10
var filterCandidates = function(form){
    //Previous request needs to be aborted.
    var request = $.ajax({
        type: 'POST',
        url: '/echo/json/',
        data: {
            json: JSON.stringify({
                count: 1
            })
        },
        success: function(data){
            if(typeof data !== 'undefined'){
                jQuery('.count').text(data.count)
                console.log(data.count);
            }
        }
    });
    return request;
};

var ajax = filterCandidates(form);

保存一个变量,然后在第二次发送之前检查它readyStateabort()在需要时调用


7
那比我想象的容易。我为这项工作创建了一个小提琴:jsfiddle.net/YzDBg/4为感兴趣的任何人。谢谢。
CharliePrynn

7
您能详细解释一下吗?
SSS

5

接受答案的变体,并从对问题的评论中采纳-这对我的应用非常有用...。

使用jQuery的$ .post()....

var request = null;

function myAjaxFunction(){
     $.ajaxSetup({cache: false}); // assures the cache is empty
     if (request != null) {
        request.abort();
        request = null;
     }
     request = $.post('myAjaxURL', myForm.serialize(), function (data) {
         // do stuff here with the returned data....
         console.log("returned data is ", data);
     });
}

多次调用myAjaxFunction(),它将杀死除最后一个以外的所有内容(我的应用程序上有一个“日期选择器”,并根据选择的日期更改价格-当有人快速单击它们而不使用上面的代码时,它是投掷硬币,看他们是否会得到正确的价格。有了它,100%正确!)


0

试试这个代码

var lastCallFired=false;

var filterCandidates = function(form){

    if(!lastCallFired){
    var request = $.ajax({
        type: 'POST',
        url: '/echo/json/',
        data: {
            json: JSON.stringify({
                count: 1
            })
        },
        success: function(data){
            if(typeof data !== 'undefined'){
                jQuery('.count').text(data.count)
                console.log(data.count);
            }
        }
    });
        setInterval(checkStatus, 20);

    }

};

if(jQuery('#search').length > 0){
    var form = jQuery('#search');
    jQuery(form).find(':input').change(function() {
        filterCandidates(form);
    });
    filterCandidates(form);
}

var checkStatus = function(){
        if(request && request.readyState != 4){
            request.abort();
        }
    else{
        lastCallFired=true;
    }
};

0
if(typeof window.ajaxRequestSingle !== 'undefined'){
  window.ajaxRequestSingle.abort();
}

window.ajaxRequestSingle = $.ajax({
  url: url,
  method: 'get',
  dataType: 'json',
  data: { json: 1 },
  success: function (data) {
    //...
  },
  complete: function () {
    delete window.ajaxRequestSingle;
  }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.