停止/中止Ajax请求而不会触发错误

时间:2014-09-29 10:00:23

标签: javascript jquery ajax

我想在页面停止时捕获所有ajax请求/中止一些请求,具体取决于我们所做的一些检查。最初 jqXHR.abort(); 有效,但问题是它正在执行我们中止的所有请求的错误事件,这是我不想要的。

我创建的示例代码段如下所示。

var newajaxOptions;
$( ":button" ).on("click", function () {
    var URL = "#";
    $.ajax({
        url: URL,
        type: 'GET',
        async: false,
        success: function(){
            alert("AJAX SUCCESS");
        },
        error: function(){
            alert("AJAX ERROR");
        }
    });            
});


$(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
    alert("BLOCKED");
    //set options to global variable so can re initiate ajax call later 
    newajaxOptions = ajaxOptions;
    jqXHR.abort();
});

P.S作为限制,我不允许对ajax请求进行任何修改,因此我只能拦截对细节的所有请求检查,以阻止那些不允许继续进行的操作。

2 个答案:

答案 0 :(得分:2)

jqXHR非常有帮助

if(jqXHR.aborted)
    return;

和脚本:

var newajaxOptions;
$( ":button" ).on("click", function () {
    var URL = "#";
    $.ajax({
        url: URL,
        type: 'GET',
        async: false,
        success: function(){
            alert("AJAX SUCCESS");
        },
        error: function(jqXHR, textStatus, errorThrown){
            if(jqXHR.aborted)
                return;
            alert("AJAX ERROR");
        }
    });
});


$( document ).ajaxSend(function(event, jqXHR, ajaxOptions) {
    alert("BLOCKED");
    //set options to global variable so can re initiate ajax call later 
    newajaxOptions = ajaxOptions;
    jqXHR.abort();
});

编辑:投掷黑客

var newajaxOptions;
$( ":button" ).on("click", function () {
    var URL = "#";
    $.ajax({
        url: URL,
        type: 'GET',
        async: false,
        success: function(){
            alert("AJAX SUCCESS");
        },
        error: function(jqXHR, textStatus, errorThrown){
            //if(jqXHR.aborted)
            //  return;
            alert("AJAX ERROR");
        }
    });
    alert("After Button Click");
});


$( document ).ajaxSend(function(event, jqXHR, ajaxOptions) {
    alert("BLOCKED");
    throw "Your request is evil! Stop right now!";
});

在这种情况下,这就像“黑客”。 Throw适用于所有浏览器,副作用是当前堆栈的中断。但是要小心alert("After Button Click");也在当前堆栈中,当你扔东西时永远不会执行。

更多关于:

throw statement

error handling using try...catch

答案 1 :(得分:0)

您应该能够重置ajaxSend

中的错误事件
$( document ).ajaxSend(function(event, jqXHR, ajaxOptions) {
    alert("BLOCKED");
    //set options to global variable so can re initiate ajax call later 
    newajaxOptions = ajaxOptions;

    ajaxOptions.error = null;

    jqXHR.abort();
});