jQuery global aerodynamic error handler在“local”错误处理器之前触发

6qfn3psc  于 12个月前  发布在  jQuery
关注(0)|答案(2)|浏览(101)

我想全局处理401错误,只在本地处理其他错误。本地意味着在AJAX调用的fail处理程序内部。
为此,我在document上实现了一个ajaxError处理程序。然而,问题是本地fail处理程序在全局处理程序之前被触发。因此全局处理程序中的event.stopImmediatePropagation()是无用的。
我怎样才能让全局的先启动,从而阻止本地的启动呢,谢谢。

mhd8tkvw

mhd8tkvw1#

对于任何寻找这种解决方案的人来说,现在可以使用jQuery的$.ajaxPrefilter函数来全局拦截特定的错误,并防止AJAX调用的fail处理程序因该错误而被执行。只需将Ajax调用中的原始Deferred对象替换为我们自己的对象:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    options.error = $.noop();
    var dfd = $.Deferred();
    jqXHR.done(dfd.resolve);
    jqXHR.fail(function () {
        if (jqXHR.status == 401) {
            // Handle the 401 error globally here
        } else {
            if (originalOptions.error) { dfd.fail(originalOptions.error); }
            dfd.rejectWith(jqXHR, Array.from(arguments));
        }
    });
    return dfd.promise(jqXHR);
});

字符串

lrl1mhuk

lrl1mhuk2#

var statusCodeError = function(error) {
        throw new Error('--> Error code ' + error.status + ' on XMLHttpRequest');
    };
    var settings = {
        type        : 'POST',
        url         : '/ajax-script.php',
        dataType    : 'json',
        context     : document.body,
        statusCode  : {
            404: statusCodeError,
            301: statusCodeError,
            302: statusCodeError,
            401: statusCodeError,
            500: statusCodeError
        }, failure : statusCodeError
    };

    $.ajaxSetup(settings);

字符串

相关问题