อะไรคือความแตกต่างระหว่างวิธีการ Success และ .done () ของ $ .ajax


102

ใครสามารถช่วยฉัน?
ผมไม่สามารถที่จะเข้าใจความแตกต่างระหว่างsuccessและของ.done()$.ajax

ถ้าเป็นไปได้โปรดยกตัวอย่าง


คุณอ่านวิธี done () ของ $ .ajax () มาจากไหน AFAIK วิธีการที่ทำนั้นเกี่ยวข้องกับ $ .Deferred object คุณอาจกำลังพูดถึง. complete () แทน?
Fabrizio Calderan


2
ตกลงมันเป็น jQuery 1.8 :) เนื่องจาก $ .ajax ส่งคืนคำสัญญาจาก jQuery 1.5 นี่เป็นการทดแทนอย่างง่ายสำหรับเรื่องของความสม่ำเสมอ (โดยใช้อินเทอร์เฟซของการเลื่อนออกไป): done () เกิดขึ้นจากความสำเร็จ (), fail () สำหรับข้อผิดพลาด () และเสมอ () เพื่อความสมบูรณ์ ()
Fabrizio Calderan

2
การเปลี่ยนแปลงที่แท้จริงคือคุณสามารถแนบการเรียกกลับหลายรายการโดยใช้โปรแกรม ดูที่หน้าเอกสารอ้างอิง $.
Fabrizio Calderan

คำตอบ:


8

กล่าวโดยย่อคือการแยกฟังก์ชันการเรียกกลับความสำเร็จจากฟังก์ชัน ajax ดังนั้นในภายหลังคุณสามารถเพิ่มตัวจัดการของคุณเองได้โดยไม่ต้องแก้ไขโค้ดดั้งเดิม (รูปแบบผู้สังเกตการณ์)

โปรดดูข้อมูลโดยละเอียดเพิ่มเติมจากที่นี่: https://stackoverflow.com/a/14754681/1049184


1
และด้านล่างนี้ตัวอย่างจะแสดงความเท่าเทียมกันของ done => success, fail => error and always => complete
StuartLC

25
คำตอบนี้พลาดประเด็น มีความแตกต่างระหว่างsuccess: ใช้เป็นพารามิเตอร์และ.success()เป็นวิธีการในไฟล์jqXHR. หลังกำลังจะเลิกใช้งาน แต่ก่อนหน้านี้คือสิ่งที่ OP กำลังถามถึง
Alnitak

2
ความสำเร็จ / ข้อผิดพลาด / เสร็จสมบูรณ์ถูกเลิกใช้และขึ้นอยู่กับการเปลี่ยนแปลงสถานะของ AJAX done / ล้มเหลว / เสมอขึ้นอยู่กับการเปลี่ยนแปลงสถานะ jQuery Deferred ดูapi.jquery.com/category/deferred-object
mickeyreiss

28
ฉันไม่อยากเชื่อคำตอบที่ตีความคำถามผิดเป็นทั้งที่ได้รับการโหวตสูงสุดและคำตอบที่ได้รับการยอมรับ ...
Transcendence

108

successจะเริ่มทำงานก็ต่อเมื่อการเรียก AJAX สำเร็จนั่นคือส่งคืนสถานะ HTTP 200 ในที่สุด errorจะเริ่มทำงานหากล้มเหลวและcompleteเมื่อคำขอเสร็จสิ้นโดยไม่คำนึงถึงความสำเร็จ

ใน jQuery 1.8 บนjqXHRวัตถุ (ส่งกลับโดย$.ajax) successถูกแทนที่ด้วยdone, errorมีfailและมีcompletealways

อย่างไรก็ตามคุณควรจะสามารถเริ่มต้นคำขอ AJAX ด้วยไวยากรณ์เก่าได้ สิ่งเหล่านี้จึงทำสิ่งที่คล้ายกัน:

// 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"); });

การเปลี่ยนแปลงนี้เป็นความเข้ากันได้กับ jQuery 1.5 ของวัตถุรอการตัดบัญชี รอการตัดบัญชี (และตอนนี้Promiseซึ่งรองรับเบราว์เซอร์ดั้งเดิมเต็มรูปแบบใน Chrome และ FX) ช่วยให้คุณเชื่อมโยงการกระทำแบบอะซิงโครนัสได้:

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

successห่วงโซ่ของฟังก์ชั่นนี้เป็นง่ายต่อการรักษากว่าปิรามิดที่ซ้อนกันของการเรียกกลับที่คุณได้รับ

อย่างไรก็ตามโปรดทราบว่าdoneขณะนี้เลิกใช้แล้วโดยสนับสนุนPromiseไวยากรณ์ที่ใช้thenแทน:

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

นี่เป็นสิ่งที่ควรค่าแก่การนำมาใช้เนื่องจากasyncและawaitขยายสัญญาที่ปรับปรุงไวยากรณ์ (และการจัดการข้อผิดพลาด):

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

การสร้างฟังก์ชันก่อนที่จะทำการร้องขอและตั้งค่าฟังก์ชันหลังจากทำการร้องขอ ดูเหมือนทั้งคู่จะเหมือนกัน ... ช่วยแสดงความแตกต่างให้ฉันดูบ้างไหม ???
suhailvs

@suhail - ไม่มีจริงๆ; ใน jQuery 1.6 มีอยู่successใน jQuery 1.8 ที่ถูกแทนที่ด้วยdone. พวกเขาทำงานในลักษณะเดียวกัน แต่doneสอดคล้องกับส่วนที่เหลือของ jQuery มากกว่า
Keith

@Keith แล้ววันนี้การใช้. done เหมือนกับการใช้ความสำเร็จหรือไม่? หรือมีอย่างอื่นที่ใหม่กว่านี้?
Roxy'Pro

@ Roxy'Pro สิ่งนี้ล้าสมัยเมื่อฉันตอบฉันจะไม่ใช้สิ่งนี้ในปี 2018 อย่างแน่นอน.doneเป็นช่วงต้น (และตอนนี้ทางตัน) แทงที่สิ่งที่กลายเป็นPromiseและตอนนี้มีการรองรับภาษาที่ค่อนข้างครอบคลุม ในโครงการใหม่ฉันจะใช้const response = await fetch(...)แทน
Keith

6

.success() จะถูกเรียกก็ต่อเมื่อเว็บเซิร์ฟเวอร์ของคุณตอบสนองด้วยส่วนหัว HTTP 200 OK - โดยทั่วไปเมื่อทุกอย่างเรียบร้อยดี

การเรียกกลับที่แนบมากับ done () จะเริ่มทำงานเมื่อการแก้ปัญหาที่เลื่อนออกไป การเรียกกลับที่แนบมากับ fail () จะเริ่มทำงานเมื่อการเลื่อนออกไปถูกปฏิเสธ

promise.done(doneCallback).fail(failCallback)

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

3
เป็นที่น่าสังเกตว่า .success () จะไม่ถูกเรียกเมื่อส่ง JSON ที่มีรูปแบบไม่ถูกต้องพร้อมรหัสสถานะ 200 / OK โดยเฉพาะอย่างยิ่งฉันพบปัญหากับโค้ดแบ็กเอนด์ของเว็บเซิร์ฟเวอร์ที่สร้างค่า NaN และทำให้เป็นอนุกรมเป็น javascript NaN (เช่นเป็นสัญลักษณ์ไม่ใช่สตริง 'NaN') ซึ่งเป็น JSON ที่ไม่ถูกต้อง - ดังนั้นการแยกวิเคราะห์การตอบสนองเป็น JSON ล้มเหลวและ. ล้มเหลว () ถูกดำเนินการ แต่สถานะการตอบกลับคือ 200 แต่ก็ยังคงเป็นจริงที่ความสำเร็จจะถูกเรียกด้วยรหัสสถานะตกลงเท่านั้น แค่อยากจะชี้ให้เห็นว่าเพียงเพราะมันโอเคไม่ได้หมายความว่ามัน 'ประสบความสำเร็จ';)
Kasapo

1

successคือการโทรกลับที่เรียกใช้เมื่อการร้องขอสำเร็จและเป็นส่วนหนึ่งของการ$.ajaxโทร doneเป็นส่วนหนึ่งของjqXHRวัตถุที่ส่งคืน$.ajax()และแทนที่successใน jQuery 1.8

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.