Sự khác biệt giữa thành công và phương thức .done () của $ .ajax là gì


102

Ai giúp tôi với?
Tôi không thể hiểu sự khác biệt giữa success.done()của $.ajax.

Nếu có thể xin vui lòng cho ví dụ.


bạn đã đọc ở đâu về phương thức done () của $ .ajax ()? AFAIK phương thức done có liên quan đến đối tượng $ .Deferred. Có thể bạn đang nói về .complete () thay thế?
Fabrizio Calderan


2
ok, đó là jQuery 1.8 :) Vì $ .ajax trả về một lời hứa từ jQuery 1.5 nên đây là một sự thay thế đơn giản cho vấn đề nhất quán (sử dụng giao diện trì hoãn): done () diễn ra thành công (), fail () cho lỗi () và luôn luôn () cho đầy đủ ()
Fabrizio Calderan

2
Sự thay đổi thực sự là bạn có thể đính kèm nhiều lệnh gọi lại theo chương trình. Xem trang tài liệu $ .Deferred.
Fabrizio Calderan

Câu trả lời:


8

Nói tóm lại, tách hàm gọi lại thành công khỏi hàm ajax để sau này bạn có thể thêm các trình xử lý của riêng mình mà không cần sửa đổi mã gốc (mẫu người quan sát).

Vui lòng tìm thêm thông tin chi tiết tại đây: https://stackoverflow.com/a/14754681/1049184


1
Và dưới nó ví dụ bản đồ ra sự tương đương của done => thành công, thất bại => lỗi và luôn => hoàn chỉnh
StuartLC

25
Câu trả lời này thiếu điểm. Có một sự khác biệt giữa success: được sử dụng như một tham số và .success()như một phương thức trên a jqXHR. Cái thứ hai đang không được chấp nhận, nhưng cái trước là những gì OP đã hỏi về.
Alnitak

2
Thành công / lỗi / hoàn thành không được dùng nữa và dựa trên các thay đổi trạng thái AJAX; done / fail / always dựa trên các thay đổi trạng thái của jQuery Deferred. Xem api.jquery.com/category/deferred-object .
mickeyreiss

28
tôi không thể tin được một câu trả lời mà hiểu sai câu hỏi là cả cao nhất bình chọn và giải pháp được chấp nhận ...
Tính siêu việt

108

successchỉ kích hoạt nếu lệnh gọi AJAX thành công, tức là cuối cùng trả về trạng thái HTTP 200. errorkích hoạt nếu nó không thành công và completekhi yêu cầu kết thúc, bất kể thành công.

Trong jQuery 1.8, jqXHRđối tượng (được trả về bởi $.ajax) successđược thay thế bằng done, errorvới failcompletevới always.

Tuy nhiên, bạn vẫn có thể khởi tạo yêu cầu AJAX với cú pháp cũ. Vì vậy, chúng làm những điều tương tự:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

Thay đổi này là để tương thích với đối tượng hoãn lại của jQuery 1.5 . Được hoãn lại (và bây giờ Promise, có hỗ trợ trình duyệt gốc đầy đủ trong Chrome và FX) cho phép bạn chuỗi các hành động không đồng bộ:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

Chuỗi chức năng này dễ duy trì hơn một kim tự tháp lồng ghép các lệnh gọi lại mà bạn nhận được success.

Tuy nhiên, xin lưu ý rằng donehiện nay không được dùng nữa vì Promisecú pháp sử dụng thenthay thế:

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

Điều này đáng được áp dụng vì asyncawaitmở rộng hứa hẹn cải thiện cú pháp (và xử lý lỗi):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}

tạo chức năng trước khi đưa ra yêu cầu và thiết lập chức năng sau khi thực hiện yêu cầu. Có vẻ như cả hai đều giống nhau ... bạn sẽ chỉ cho tôi một số khác biệt khác ???
suhailvs

@suhail - thực sự không có bất kỳ; trong jQuery 1.6 có success, trong jQuery 1.8 đã được thay thế bằng done. Chúng hoạt động theo cùng một cách, nhưng donephù hợp hơn với phần còn lại của jQuery.
Keith

@Keith vậy hôm nay sử dụng .done cũng giống như sử dụng thành công? hoặc có cái gì khác thậm chí còn mới hơn?
Roxy'Pro

@ Roxy'Pro cái này đã lỗi thời khi tôi trả lời, chắc chắn tôi sẽ không sử dụng cái này vào năm 2018. .doneĐó là cú đâm sớm (và bây giờ là bế tắc) của jQuery với những gì đã trở thành Promisevà hiện đã hỗ trợ ngôn ngữ khá toàn diện. Trong các dự án mới, tôi sẽ sử dụng const response = await fetch(...)thay thế.
Keith

6

.success() chỉ được gọi nếu máy chủ web của bạn phản hồi với tiêu đề 200 OK HTTP - về cơ bản khi mọi thứ đều ổn.

Các lệnh gọi lại được đính kèm với done () sẽ được kích hoạt khi việc trì hoãn được giải quyết. Các lệnh gọi lại được đính kèm với fail () sẽ được kích hoạt khi lệnh hoãn bị từ chối.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback

3
Cần lưu ý rằng .success () KHÔNG được gọi khi JSON không đúng định dạng được gửi lại với mã trạng thái 200 / OK. Cụ thể, tôi đã gặp sự cố với mã phụ trợ máy chủ web tạo ra các giá trị NaN và tuần tự hóa chúng dưới dạng javascript NaN (tức là dưới dạng ký hiệu, không phải chuỗi 'NaN') thực sự không phải là JSON hợp lệ - vì vậy việc phân tích cú pháp của phản hồi dưới dạng JSON không thành công và .fail () được thực thi, nhưng trạng thái phản hồi là 200. Nhưng vẫn đúng rằng thành công CHỈ được gọi với mã trạng thái OK; chỉ muốn chỉ ra rằng chỉ vì nó ổn, không có nghĩa là nó 'thành công';)
Kasapo 23/12/15

1

successlà lệnh gọi lại được gọi khi yêu cầu thành công và là một phần của $.ajaxcuộc gọi. donethực sự là một phần của jqXHRđối tượng được trả về $.ajax()và thay thế successtrong jQuery 1.8.

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.