如何从.done()内部调用.fail()来处理一般错误?

时间:2013-03-10 08:09:53

标签: jquery promise

jQuery的AJAX .fail()是一个很好的错误处理程序,可以处理“404 Not Found”错误等等,但我们怎样才能从.done()内部故意调用它来处理一般错误情况,例如数据时用户提供的内容不正确?

2 个答案:

答案 0 :(得分:11)

您可以使用在每种情况下都会调用错误的常用函数。

$.ajax( 'url' )
    .done( function( data, textStatus, jqXHR ) {
        if( data == 'Invalid' ) {
            ajaxError( jqXHR, "usererror" );
        }
    })
    .fail( ajaxError );

function ajaxError( jqXHR, textStatus, errorThrown ) {
    console.log( 'Ajax error: ' + textStatus );
}

答案 1 :(得分:3)

@ Juhana的代码对大多数可能性都有好处。

但是,如果通过单独检查data无法可靠地预测出错误,请考虑以下变体:

$.ajax( 'url' ).done( function( data, textStatus, jqXHR ) {
    try {
        var dataLooksGood = ......;//(boolean) Test data for predictable data errors here
        if( !dataLooksGood ) throw( new Error("data invalid"); )
        //Handle data here.
        //Any naturally-ocurring errors or further manually-thrown errors will be caught below.
    }
    catch(err) {
        ajaxError( jqXHR, "AJAX successful but: " + err.message );
    }
}).fail( ajaxError ).always(function() {
    //Here do whatever is necessary after success or error
});


function ajaxError( jqXHR, textStatus, errorThrown ) {
    console.log( 'AJAX error: ' + textStatus );
}

通过捕获错误,即使发生不可预测的错误,也允许always处理程序触发。因此,无论发生错误,您都可以更好地保证“loading ...”消息或微调器图形被杀死。