【问题标题】:Exceptions thrown in jQuery AJAX callbacks swallowed?jQuery AJAX 回调中抛出的异常被吞没了?
【发布时间】:2011-02-12 21:35:21
【问题描述】:

除了在每个回调中添加 try..catch 块之外,还有什么方法可以处理 jQuery 中 AJAX 回调引发的异常?在这种情况下不调用错误函数。

$.ajax(
{
    url: 'myurl.rails',
    success: function( data )
    {
        throw 'Oh no!';
    },
    error: function ( xhr, textStatus, errorThrown )
    {
        console.log( 'AJAX call failed', xhr, textStatus, errorThrown );
    }               
} );

【问题讨论】:

    标签: javascript jquery ajax exception


    【解决方案1】:

    如果你看一下 jQuery 1.4.2 的非缩小版,相关行是 5264 到 5274:

    function success() {
        // If a local callback was specified, fire it and pass it the data
        if ( s.success ) {
            s.success.call( callbackContext, data, status, xhr );
        }
    
        // Fire the global callback
        if ( s.global ) {
            trigger( "ajaxSuccess", [xhr, s] );
        }
    }
    

    jQuery 只是调用应用于设置对象(如果存在)的success 函数,而不关心函数返回或抛出的内容。

    你可以做的是像这样使用jQuery.ajaxSetup()

    jQuery.ajaxSetup({
        success: function() {
            try {
                if ( this.mysuccess ) {
                    this.mysuccess.apply( this, arguments );
                }
            }
            catch(err) {
                // whatever
            }
        }
    });
    

    在单独的jQuery.ajax 调用中使用mysuccess(或任何您喜欢的名称)而不是success

    【讨论】:

    【解决方案2】:

    您是否研究过 jQuery 的任何全局 AJAX 功能,例如 ajaxSetupajaxError

    【讨论】:

    • 正如贾斯汀所说,error/ajaxError 回调是针对失败的请求,而不是针对成功回调中应用程序代码中抛出的异常。
    【解决方案3】:

    error 回调旨在在请求本身出现问题时使用。根据文档:

    请求失败时调用的函数。该函数被传递三个参数:XMLHttpRequest 对象、描述发生的错误类型的字符串和可选的异常对象(如果发生了)。第二个参数的可能值(除了 null)是“timeout”、“error”、“notmodified”和“parsererror”。

    因此,如果您返回的数据有问题,那么您应该在 success 回调中处理它 - 也许通过将其记录到控制台或通知用户。

    【讨论】:

    • 我在我的网站中使用了相当多的 AJAX,并且将每一个成功回调包装在一个带有日志记录的 try..catch 块中并不理想。
    • 您在自己的网站上是否看到了特定类型的错误?您到底看到了什么,一旦检测到错误,您打算做什么?
    • 我只想记录任何可能引发的异常。特定的异常类型无关紧要,除非它是意外的。
    • 我知道这可以方便您的特定项目;你可以使用ajaxSetup 做你想做的事;请记住,如果其他插件或代码片段依赖于默认(未捕获)成功行为,这会使您面临失败。根据the note in the jQuery documentation推荐的方式正如贾斯汀所说的
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多