javascript jQuery AJAX 捕获状态代码错误

qcuzuvrc  于 2023-01-16  发布在  Java
关注(0)|答案(4)|浏览(140)

我尝试使用jQuery的$. ajax捕获特定的响应错误。
当出现500或404错误代码时,它不会运行状态代码函数,而是运行错误函数,我会得到一个警报框,而不是应该发生的情况
下面是我的代码

// get page data
getPageData: function(url, callback) {

    url = ajaxLoader.getURL(url);

    $.ajax({
        url: url,
        type: 'get',
        data: {_ajax_loader: 1},
        error: function(xhr, status) {
            alert('There was a problem loading that page. You may need to refresh.');
        },
        statusCode: {
                404: function(response) {
                    ajaxLoader.fetchPage('/missing');
                },
                500: function(response) {
                    ajaxLoader.fetchPage('/error'); 
                }
            }           
    }).done(callback);
},
von4xj4u

von4xj4u1#

这是设计好的。error在服务器返回错误时执行。此外,statusCode中定义的函数也是called。这同样适用于completesuccess处理程序。
您可以修改错误处理程序,使其在statusCode中已定义错误代码时不运行。

$.ajax({
    url: '/echo',
    type: 'get',
    success: function() {
        console.log('ajax.success');
    },
    error: function(xhr, status) {
        // check if xhr.status is defined in $.ajax.statusCode
        // if true, return false to stop this function
        if (typeof this.statusCode[xhr.status] != 'undefined') {
            return false;
        }
        // else continue
        console.log('ajax.error');
    },
    statusCode: {
        404: function(response) {
            console.log('ajax.statusCode: 404');
        },
        500: function(response) {
            console.log('ajax.statusCode: 500');
        }
    }
});

Demo

3zwtqj6y

3zwtqj6y2#

问题是除了statusCode对象之外,您还使用了错误回调函数,错误回调函数在任何类型的错误发生时都会被触发,包括HTTP错误404或500。
要解决此问题,需要删 debugging 误回调,并且只使用statusCode对象。
下面是正确的代码:
//获取页面数据getPageData:函数(url、回调){

url = ajaxLoader.getURL(url);

$.ajax({
    url: url,
    type: 'get',
    data: {_ajax_loader: 1},
    statusCode: {
            404: function(response) {
                ajaxLoader.fetchPage('/missing');
            },
            500: function(response) {
                ajaxLoader.fetchPage('/error'); 
            }
        }           
}).done(callback);

},
这样,当返回404或500状态代码时,只会调用适当的函数,而不会调用错误回调。

g9icjywg

g9icjywg3#

AJAX 有successerror两个函数,所以可以使用为这两个函数定义的jqXHR来处理它。
成功时:

success: function(data, status, jqXHR) {
        switch(jqXHR.status){
           case 200:
                    //status ok
                    break;
           case 206:
                    //Partial Content
                    //awesome code for handle it
                    break;

        }
    }

出错时:

error: function(jqXHR, status, errorThrown) {
        switch(jqXHR.status){
           case 400:
                    //Bad Request
                    //awesome code for handle it
                    break;
           case 404:
                    //Not Found
                    //awesome code for handle it
                    break;

        }
    }

此处为所有status codes

kuarbcqp

kuarbcqp4#

它将执行error和相应的StatusCode函数。
您的代码的唯一问题是,在StatusCode函数中,您有response的参数(我假设它是success函数的参数),而它应该与error函数的参数匹配,如下所示:

// get page data
getPageData: function(url, callback) {

    url = ajaxLoader.getURL(url);

    $.ajax({
        url: url,
        type: 'get',
        data: {_ajax_loader: 1},
        error: function(xhr, status) {
            alert('There was a problem loading that page. You may need to refresh.');
        },
        statusCode: {
            404: function(xhr, status) {
                ajaxLoader.fetchPage('/missing');
            },
            500: function(xhr, status) {
                ajaxLoader.fetchPage('/error'); 
            }
        }           
    }).done(callback);
},

这样,如果接收到404或500,则error函数和404/500函数都将执行。如果您只希望执行404/500函数,并且error函数仅在返回的状态不是404或500时执行,则可以执行以下操作:

// get page data
getPageData: function(url, callback) {

    url = ajaxLoader.getURL(url);

    $.ajax({
        url: url,
        type: 'get',
        data: {_ajax_loader: 1},
        error: function(jqXHR, status) {
            switch (jqXHR.status) {
                case 404:
                    ajaxLoader.fetchPage('/missing');
                    break;
                case 500:
                    ajaxLoader.fetchPage('/error');
                    break;
                default:
                    alert('There was a problem loading that page. You may need to refresh.');
            }
        }         
    }).done(callback);
},

相关问题