ฉันควรใช้. done () และ .fail () สำหรับรหัส jQuery AJAX ใหม่แทนที่จะประสบความสำเร็จและมีข้อผิดพลาด


167

ฉันได้เขียนโค้ดดังนี้:

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

แต่เมื่อฉันดู.ajax()เอกสาร jQuery ในตอนท้ายดูเหมือนว่าฉันควรเขียนโค้ดแบบนี้ด้านล่างหรืออย่างน้อยก็แนะนำให้เพิ่ม a .done()และ 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;
});

ปรับปรุง

ถ้าฉันรหัสเช่นนี้มันเหมือนกันหรือมีประโยชน์ที่จะแบ่งออกเป็นสามบาง?

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

คำตอบ:


165

ตามที่ระบุโดย user2246674 การใช้successและerrorเป็นพารามิเตอร์ของฟังก์ชัน ajax นั้นถูกต้อง

เพื่อให้สอดคล้องกับคำตอบก่อนหน้านี้ให้อ่านเอกสาร:

ประกาศการเลิกใช้ :

การเรียก jqXHR.success (), jqXHR.error () และ jqXHR.complete () จะถูกปฏิเสธใน jQuery 1.8 ในการจัดเตรียมรหัสของคุณสำหรับการลบในที่สุดให้ใช้ jqXHR.done (), jqXHR.fail () และ jqXHR.always () แทน

หากคุณกำลังใช้ฟังก์ชั่นการโทรกลับการจัดการ (โดยใช้วิธีการผูกพันตัวอย่าง), การใช้งาน.done(), .fail()และ.always()แทนsuccess(), และerror()complete()


54
ฉันไม่เห็นด้วย. อ้างอิงการเจรจาเกี่ยวกับฟังก์ชั่นการโทรกลับการจัดการ (เช่น.error, .success) ซึ่งจะเลิกในความโปรดปรานของรูปแบบการรอการตัดบัญชีสากลมากขึ้น แต่พารามิเตอร์กับajaxวิธีการที่จะไม่เลิกและมีทั้งที่ถูกต้องและเป็นที่ยอมรับ - แม้ใน jQuery 1.9 / 2.0! ในทุกรูปแบบปัจจุบันajaxยังคงส่งกลับรอการตัดบัญชี; อาจจะมีการโทรกลับรอการตัดบัญชีที่แนบมาแล้ว
user2246674

1
นี่คือ jQuery 1.9 และความสำเร็จ:, ข้อผิดพลาด: และสมบูรณ์: ยังคงใช้งานได้ อย่างไรก็ตามคำถามของฉันคือ. done () == สู่ความสำเร็จ:?
TARKUS

3
@GregoryLewis จาก JQuery 1.10 รหัสที่มา: jqXHR.success = jqXHR.done;.
Michael Laffargue

9
ฉันสุจริตต้องการsuccess, ,fail always
ahnbizcad

4
ว้าวฉันอ่านผิดเอกสารด้วย แท้จริงฉันคิดว่าตัวเลือก 'ความสำเร็จ' / 'ข้อผิดพลาด' สำหรับ $ .ajax ถูกเขียนใหม่เป็น 'เสร็จ / ล้มเหลว' มันเป็นเพียงเมธอด callback chains สุจริตฉันคิดว่าพวกเขาควรได้เปลี่ยนชื่อตัวเลือกเช่นกัน นั่นทำให้ฉันนิ่งงันไปหลายชั่วโมง
OzzyTheGiant

12

ฉันต้องการเพิ่มบางอย่างในโพสต์ของ @Michael Laffargue:

jqXHR.done() เร็วกว่า!

jqXHR.success()มีเวลาโหลดในการติดต่อกลับและบางครั้งสามารถเขียนสคริปต์มากเกินไป ฉันพบว่าอย่างหนักก่อน

UPDATE:

การใช้ jqXHR.done() , jqXHR.fail()และjqXHR.always()คุณจะสามารถจัดการกับการร้องขออาแจ็กซ์ Generaly คุณสามารถกำหนด Ajax ในตัวแปรหรือวัตถุบางอย่างและใช้ตัวแปรหรือวัตถุนั้นในส่วนใด ๆ ของรหัสของคุณและรับข้อมูลได้เร็วขึ้น ตัวอย่างที่ดี:

/* 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
คุณมีข้อมูลอ้างอิงที่น่าเชื่อถือและตรวจสอบได้หรือไม่?
Paul Vargas

@ PaulVargas ฉันไม่เคยทำแบบทดสอบประสิทธิภาพ แต่ในทางปฏิบัติฉันพบว่ามันใช้งานได้ คุณสามารถลองด้วยตัวเอง
Ivijan Stefan Stipić

1
โปรดแสดงหลักฐานใด ๆ ที่น่าเชื่อถือ
wonsuc

อย่างที่คุณทราบฟังก์ชั่นการโทรกลับจะช้ากว่าเมื่อเทียบกับการส่งคืนวัตถุบางอย่างจากฟังก์ชั่น บางครั้งมีผลกระทบเล็กน้อย แต่บางครั้งอาจมีขนาดใหญ่มากหากคุณมีการโทรจำนวนมาก
Ivijan Stefan Stipić

7

ในคำง่าย ๆ

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

ถ้ามันได้รับ info.text มันจะแจ้งเตือนและฟังก์ชั่นอะไรก็ตามที่คุณเพิ่มหรือถ้ามีวิธีใดที่ไม่สามารถดึงข้อมูล info.text จากเซิร์ฟเวอร์จากนั้นฟังก์ชั่นการแจ้งเตือนหรือข้อผิดพลาด


0

เมื่อเราจะโยกย้าย JQuery จาก 1.x เป็น 2x หรือ 3.x ในแอปพลิเคชันเก่าที่มีอยู่ของเราจากนั้นเราจะใช้. do, .fail แทนความสำเร็จข้อผิดพลาดเนื่องจากการไล่ระดับขึ้นของ JQuery จะเลิกใช้วิธีการเหล่านี้สำหรับ ตัวอย่างเมื่อเราทำการโทรไปยังวิธีการทางเว็บเซิร์ฟเวอร์จากนั้นเซิร์ฟเวอร์จะส่งคืนวัตถุที่สัญญาไปยังวิธีการโทร (วิธีการ Ajax) และวัตถุสัญญานี้มี. do, .fail..etc วิธีการดังนั้นเราจะตอบสนองความสำเร็จและล้มเหลวเหมือนกัน ด้านล่างเป็นตัวอย่าง (สำหรับคำขอ POST เช่นเดียวกับที่เราสามารถสร้างสำหรับประเภทคำขอเช่น 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.
                });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.