【问题标题】:How to call .fail() from inside .done() to handle general errors?如何从 .done() 内部调用 .fail() 来处理一般错误?
【发布时间】:2013-03-11 00:04:03
【问题描述】:

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

【问题讨论】:

  • 一旦.done() 被执行并且你在那个回调中,决定对同一个promise 对象执行.fail() 是不是太晚了?您应该使用更传统的 javascript 错误处理,例如异常或错误检查,或者在对象上放置自己的错误回调。

标签: jquery promise


【解决方案1】:

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

$.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 );
}

【讨论】:

    【解决方案2】:

    @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 处理程序将被允许触发,即使发生不可预测的错误。因此,无论是否发生错误,您都可以更好地保证“正在加载...”消息或微调器图形被终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2020-04-18
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多