Tôi có nên sử dụng .done () và .fail () cho mã AJAX jQuery mới thay vì thành công và lỗi không


166

Tôi đã mã hóa như thế này:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

Nhưng khi tôi xem .ajax()tài liệu jQuery ở cuối, có vẻ như tôi đề nghị tôi nên mã hóa như thế này bên dưới hoặc ít nhất là nó gợi ý thêm một .done()và a .fail():

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

Cập nhật

Nếu tôi viết mã như thế này thì nó giống nhau hay có một số lợi thế để chia nó thành ba?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});

Câu trả lời:


164

Như đã nêu bởi user2246674, sử dụng successerrorlàm tham số của hàm ajax là hợp lệ.

Để phù hợp với câu trả lời tiền lệ, hãy đọc tài liệu:

Thông báo khấu hao :

Các cuộc gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () sẽ không được chấp nhận trong jQuery 1.8. Để chuẩn bị mã của bạn để loại bỏ cuối cùng, hãy sử dụng jqXHR.done (), jqXHR.fail () và jqXHR.always ().

Nếu bạn đang sử dụng các hàm callback-thao tác (sử dụng phương pháp-chaining ví dụ), sử dụng .done(), .fail().always()thay vì success(), error()complete().


54
Tôi không đồng ý. Các tài liệu tham khảo nói về chức năng gọi lại-thao tác (ví dụ .error, .success) mà đang phản đối ủng hộ mô hình thu nhập hoãn lại phổ biến hơn, nhưng các tham số cho các ajaxphương pháp không bị phản đối và đều hợp lệ và có thể chấp nhận - ngay cả trong jQuery 1.9 / 2.0! Trong tất cả các hình thức hiện tại, ajaxvẫn trả về Trì hoãn; có thể với các cuộc gọi lại hoãn lại đã được đính kèm.
dùng2246674

1
Đây là jQuery 1.9 và thành công:, lỗi:, và hoàn thành: vẫn có thể sử dụng được. Tuy nhiên, câu hỏi của tôi là, .done () == để thành công :?
TARKUS

3
@GregoryLewis Từ mã nguồn JQuery 1.10 : jqXHR.success = jqXHR.done;.
Michael Laffargue

9
Tôi muốn thành thật thích success, fail, always.
ahnbizcad

4
WOW, tôi cũng đọc sai tài liệu. Tôi thực sự nghĩ rằng các tùy chọn 'thành công' / 'lỗi' cho $ .ajax đã được viết lại thành 'xong / thất bại'. Đó chỉ là chuỗi phương thức gọi lại. Thành thật mà nói, tôi nghĩ họ cũng nên chuyển tên tùy chọn. Điều đó đã làm tôi bối rối trong nhiều giờ.
OzzyTheGiant

12

Tôi muốn thêm một cái gì đó vào bài đăng của @Michael Laffargue:

jqXHR.done() nhanh hơn!

jqXHR.success()có một số thời gian tải trong cuộc gọi lại và đôi khi có thể làm quá mức tập lệnh. Tôi thấy rằng trên con đường khó khăn trước đây.

CẬP NHẬT:

Sử dụng jqXHR.done(), jqXHR.fail()jqXHR.always()bạn có thể thao tác tốt hơn với yêu cầu ajax. Bạn có thể định nghĩa ajax trong một số biến hoặc đối tượng và sử dụng biến hoặc đối tượng đó trong bất kỳ phần nào trong mã của bạn và nhận dữ liệu nhanh hơn. Ví dụ tốt:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});

9
Bạn có bất kỳ tài liệu tham khảo đáng tin cậy và có thể kiểm chứng?
Paul Vargas

@PaulVargas Tôi không bao giờ thực hiện một số bài kiểm tra hiệu suất nhưng trong thực tế tôi thấy điều này có hiệu quả. Bạn có thể tự mình thử.
Ivijan Stefan Stipić

1
Vui lòng cung cấp bất kỳ bằng chứng nào đáng tin cậy.
wonsuc

Như bạn đã biết, các hàm gọi lại chậm hơn so với trả về một số đối tượng từ hàm. Đôi khi là tác động nhỏ nhưng đôi khi có thể rất lớn nếu bạn có nhiều cuộc gọi.
Ivijan Stefan Stipić

7

Nói một cách đơn giản

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

nếu nó nhận được thông tin. Nó sẽ cảnh báo và bất kỳ chức năng nào bạn thêm hoặc nếu có cách nào không thể truy xuất thông tin từ máy chủ thì chức năng cảnh báo hoặc lỗi.


0

Khi chúng tôi sẽ di chuyển JQuery từ 1.x sang 2x hoặc 3.x trong ứng dụng cũ của chúng tôi, thì chúng tôi sẽ sử dụng .done, .fail thay vì thành công, lỗi khi tăng dần JQuery sẽ bị từ chối các phương thức này. ví dụ khi chúng ta thực hiện một cuộc gọi đến các phương thức web của máy chủ thì máy chủ sẽ trả về các đối tượng lời hứa cho các phương thức gọi (phương thức Ajax) và các đối tượng lời hứa này chứa các phương thức .done, .fail..etc. Dưới đây là ví dụ (dành cho yêu cầu POST giống như cách chúng ta có thể xây dựng cho loại yêu cầu như GET ...)

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
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.