调用 jquery ajax - .fail vs. :error

Posted

技术标签:

【中文标题】调用 jquery ajax - .fail vs. :error【英文标题】:Call to jquery ajax - .fail vs. :error 【发布时间】:2012-10-21 12:55:25 【问题描述】:

我应该使用哪一个?

有什么理由使用其中一个而不是另一个?

一种更适合错误处理吗?

$.ajax(
    url: url,
    data:  start: start, end: end 
).done(function(data, textStatus, jqXHR) 
    $('#myElement').append(data);
).fail(function() 
    // report error    
);

$.ajax(
    url: url,
    data:  start: start, end: end ,
    success: function(data, textStatus, jqXHR) 
        $('#myElement').append(data);
    ,
    error: function(jqXHR, textStatus, errorThrown) 
        // report error
    
);

【问题讨论】:

【参考方案1】:

这两个选项是等价的。

不过,promise 样式的接口(@98​​7654322@ 和 .done())允许您将创建请求的代码与处理响应的代码分开。

您可以编写一个发送 AJAX 请求并返回 jqXHR 对象的函数,然后在其他地方调用该函数并添加一个处理程序。

当与.pipe() 函数结合使用时,promise 样式的接口还可以帮助减少在进行多个 AJAX 调用时的嵌套:

$.ajax(...)
    .pipe(function()  
        return $.ajax(...);
    )
    .pipe(function()  
        return $.ajax(...);
    )
    .pipe(function()  
        return $.ajax(...);
    );

【讨论】:

“从 jQuery 1.8 开始,不推荐使用 deferred.pipe() 方法。应该使用替代它的 deferred.then() 方法。” api.jquery.com/deferred.pipe【参考方案2】:

只是为了刷新一下......

从 jQuery 1.8 开始,成功和错误方法已被弃用。

jQuery Ajax

弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调自 jQuery 1.8 起已弃用。要为最终删除代码做好准备,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。

【讨论】:

这实际上是对jqXHR对象上的error()的弃用,而不是$.ajax本身,这是用户所指的。 @AdamGrant, $.ajax 返回 jqXHR,所以@slohr 是正确的。 你是对的。我应该改写我的评论,对successerror 的弃用不适用于传递给$.ajax() 的对象级函数 在这上面花了几个小时,是的,我发现弃用的是方法,而不是你传递给 $.ajax() 的选项。【参考方案3】:

使用chainable deferred object promise 样式可以实现更简洁的结构并使用always。

let data = "key":"value"

$.ajax(
    type: 'PUT',
    url: 'http://example.com/api',
    contentType: 'application/json',
    data: JSON.stringify(data), 
).done(function () 
    console.log('SUCCESS');
).fail(function (msg) 
    console.log('FAIL');
).always(function (msg) 
    console.log('ALWAYS');
);

【讨论】:

以上是关于调用 jquery ajax - .fail vs. :error的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 全局 ajax 错误处理程序在“本地”之前触发

jQuery ajax 请求作为延迟 - 包装失败回调

JQuery ajax调用asp.net的webMethod

如何捕获 jQuery AJAX 错误?

实现启用 AJAX 的 WCF 服务 - 来自 JQuery 的调用没有响应

laravel 4: URL::route vs jquery