调用jquery ajax-.fail vs.:error


76

我应该使用哪一个?

有什么理由使用一种而不是另一种吗?

错误处理更好吗?

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

Answers:


43

这两个选项是等效的。

但是,promise风格的接口(.fail().done())使您可以将创建请求的代码与处理响应的代码分开。

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

与该.pipe()功能结合使用时,promise风格的接口还可以帮助减少在进行多个AJAX调用时的嵌套:

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

34
“从jQuery 1.8开始,不推荐使用deferred.pipe()方法。应该使用deferred.then()方法代替它。” api.jquery.com/deferred.pipe
richardaday13年

31

只是为了使这个新鲜...

从jQuery 1.8开始,不赞成使用成功和错误的方法。

jQuery Ajax

弃用通知:从jQuery 1.8开始,不再使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备将其最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。


10
实际上,这是error()jqXHR对象的弃用,而不是$.ajax对用户本身的弃用。
亚当·格兰特

1
@AdamGrant$.ajax 返回a jqXHR,因此@slohr是正确的。
混凝土塘鹅

8
你是对的。我应该改写我的评论,不赞成使用,success并且error不适用于传入的对象级功能$.ajax()
Adam Grant

2
在此上花了几个小时,是的,我发现弃用的是方法,而不是您传递给的选项$.ajax()
adi518

3

使用可链接的延迟对象承诺样式可以使结构更整洁并始终使用。

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');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.