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

Cha*_*ynn 67 javascript ajax jquery

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

但是,在前一个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);
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<form id="search" name="search">
    <input name="test" type="text" />
    <input name="testtwo" type="text" />
</form>
<span class="count"></span>
Run Code Online (Sandbox Code Playgroud)

小智 98

 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
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 应该不是两个响应处理程序(`success`和`error`)都将`currentRequest`设置回`null`? (11认同)
  • 啊,不.`beforeSend`正在执行*之前*``jqXHR`对象被赋值给`currentRequest`.因此,之前的呼叫在那里被中止. - 总是欣赏评论很好的答案 (9认同)
  • 在GET类型中,此解决方案对我不起作用.没用POST检查. (5认同)
  • 虽然此代码可能会回答问题,但提供有关*如何* 和*为什么* 解决问题的附加上下文将提高​​答案的长期价值。 (5认同)
  • 奇迹般有效。对于它不起作用的人,也许您在进行 ajax 调用的函数内部初始化 currentRequest=null 时犯了一个错误,请尝试在函数外部初始化它。我犯了那个错误;) (4认同)
  • OP问“我将如何中止先前的ajax调用”。但是在这里,您正在中止“ currentRequest”,这是较新的。因此,前一个将执行,新请求将被中止。对? (3认同)

Rom*_*mko 9

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);
Run Code Online (Sandbox Code Playgroud)

保存在变量中,然后在发送第二次之前,检查它readyState并abort()在需要时调用

  • 你能详细解释一下吗? (7认同)
  • 这比我想象的要容易.我创造了一个这个工作的小提琴:http://jsfiddle.net/YzDBg/4/对任何有兴趣的人.谢谢. (5认同)

CFP*_*ort 6

已接受答案的变体并从对问题的评论中采用 - 这对我的应用程序很有用....

使用 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);
     });
}
Run Code Online (Sandbox Code Playgroud)

根据需要多次调用 myAjaxFunction(),它会杀死除最后一个之外的所有内容(我的应用程序上有一个“日期选择器”,并根据所选日期更改价格 - 当有人在没有上述代码的情况下快速点击它们时,它是抛硬币看他们是否会得到正确的价格。有了它,100% 正确!)