Gọi tới jquery ajax - .fail vs.: error


77

Tôi nên sử dụng cái nào?

Có lý do gì để sử dụng cái này thay vì cái kia không?

Có phải một trong những tốt hơn để xử lý lỗi?

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

HOẶC LÀ

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

Câu trả lời:


43

Hai tùy chọn là tương đương.

Tuy nhiên, giao diện kiểu hứa hẹn ( .fail().done()) cho phép bạn tách mã tạo yêu cầu khỏi mã xử lý phản hồi.

Bạn có thể viết một hàm gửi yêu cầu AJAX và trả về đối tượng jqXHR, sau đó gọi hàm đó ở nơi khác và thêm một trình xử lý.

Khi được kết hợp với .pipe()chức năng, giao diện kiểu hứa hẹn cũng có thể giúp giảm việc lồng vào nhau khi thực hiện nhiều lệnh gọi AJAX:

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

34
"Kể từ jQuery 1.8, phương thức deferred.pipe () không được dùng nữa. Phương thức deferred.then (), phương thức thay thế nó, nên được sử dụng thay thế." api.jquery.com/deferred.pipe
richardaday

31

Chỉ để làm mới điều này ...

Phương pháp tiếp cận lỗi và thành công đã không được chấp nhận kể từ jQuery 1.8.

jQuery Ajax

Thông báo ngừng sử dụng: Các lệnh gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () không được chấp nhận kể từ jQuery 1.8. Để chuẩn bị mã của bạn cho việc xóa cuối cùng, hãy sử dụng jqXHR.done (), jqXHR.fail () và jqXHR.always () để thay thế.


10
Đây thực sự là một lời cầu xin của error()trên jqXHRđối tượng, chứ không phải $.ajaxbản thân, đó là những gì người dùng được đề cập đến.
Adam Grant

1
@AdamGrant, $.ajax trả về a jqXHR, vì vậy @slohr là đúng.
Concrete Gannet

8
Bạn đúng. Tôi nên xây dựng lại và nhận xét của tôi, việc không dùng trên successerrorkhông áp dụng cho các chức năng mức đối tượng được truyền vào$.ajax()
Adam Grant

2
Đã dành vài giờ cho việc này và vâng, tôi nhận thấy việc không dùng nữa là các phương thức chứ KHÔNG phải các tùy chọn bạn chuyển đến $.ajax().
adi518

3

Sử dụng kiểu hứa đối tượng trì hoãn có thể phân bổ cho phép cấu trúc rõ ràng hơn và luôn sử dụng .

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');
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.