jQuery ajax นิยามฟังก์ชันการเรียกกลับสำเร็จ


91

ฉันต้องการใช้ jQuery ajax เพื่อดึงข้อมูลจากเซิร์ฟเวอร์

ฉันต้องการใส่นิยามฟังก์ชันการเรียกกลับสำเร็จนอก.ajax()บล็อกดังต่อไปนี้ ดังนั้นฉันต้องประกาศตัวแปรdataFromServerดังต่อไปนี้เพื่อที่ฉันจะสามารถใช้ข้อมูลที่ส่งคืนจากการเรียกกลับสำเร็จได้หรือไม่

ฉันเคยเห็นคนส่วนใหญ่กำหนดการเรียกกลับสำเร็จภายใน.ajax()บล็อก รหัสต่อไปนี้ถูกต้องหรือไม่หากฉันต้องการกำหนดการเรียกกลับความสำเร็จภายนอก

var dataFromServer;  //declare the variable first

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData(dataFromServer)
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

คำตอบ:


93

เพียงใช้:

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

successคุณสมบัติต้องมีเพียงการอ้างอิงถึงฟังก์ชั่นและผ่านข้อมูลที่เป็นพารามิเตอร์ไปยังฟังก์ชั่นนี้

คุณสามารถเข้าถึงhandleDataฟังก์ชันของคุณเช่นนี้ได้เนื่องจากhandleDataมีการประกาศทาง JavaScript จะแยกวิเคราะห์โค้ดของคุณสำหรับการประกาศฟังก์ชันก่อนที่จะเรียกใช้ดังนั้นคุณจะสามารถใช้ฟังก์ชันในโค้ดที่อยู่ก่อนการประกาศจริงได้ นี้เป็นที่รู้จักกันยก

สิ่งนี้ไม่นับรวมสำหรับฟังก์ชันที่ประกาศเช่นนี้แม้ว่า:

var myfunction = function(){}

สิ่งเหล่านี้จะใช้ได้เฉพาะเมื่อล่ามส่งผ่าน

ดูคำถามนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ 2 วิธีในการประกาศฟังก์ชัน


1
@Alnitak แนะนำเรื่องนี้เมื่อไหร่deferred objects? ฉันไม่เคยเห็นมาก่อน นอกจากนี้ดูเหมือนว่าจะยุ่งเล็กน้อยเนื่องจากรหัสที่กำหนดสิ่งที่จะโทรกลับไปใช้อยู่ในตำแหน่งที่แตกต่างจากการโทร AJAX จริง
Cerbrus

4
มันถูกนำมาใช้ใน jQuery 1.5 และก็ไกลsuccess:ยุ่งน้อยกว่าการใช้ การแยกการโทรกลับจาก AJAX เป็นสิ่งที่ดี ! ดูบันทึกที่ฉันเพิ่งเพิ่มไว้ท้ายคำตอบของฉัน
Alnitak

@Alnitak ฉันจะดู มาดูกันว่าฉันจะมั่นใจได้
ไหม

@Alnitak: วัตถุที่รอการตัดบัญชีเป็นที่ต้องการมากกว่าการเรียกกลับสำเร็จหรือไม่? ขอบคุณ.
ตองกา

@tonga IMHO ใช่เป็นที่ต้องการมาก หากโค้ดของคุณเคยใช้$.get()งานเป็นต้นมาจะไม่สามารถเพิ่มerror:ตัวจัดการได้เนื่องจาก$.getไม่รองรับ แต่คุณสามารถเพิ่ม.failไปยังรอการตัดบัญชีผล$.getของ
Alnitak

200

วิธี "ใหม่" ในการดำเนินการนี้ตั้งแต่ jQuery 1.5 (ม.ค. 2011) คือการใช้วัตถุที่รอการตัดบัญชีแทนที่จะส่ง successเรียกกลับ คุณควรกลับผลของ$.ajaxแล้วใช้.done, .failวิธีการอื่น ๆ เพื่อเพิ่มการเรียกกลับด้านนอกของ$.ajaxการโทร

function getData() {
    return $.ajax({
        url : 'example.com',
        type: 'GET'
    });
}

function handleData(data /* , textStatus, jqXHR */ ) {
    alert(data);
    //do some stuff
}

getData().done(handleData);

สิ่งนี้จะแยกการจัดการการโทรกลับจากการจัดการ AJAX ช่วยให้คุณสามารถเพิ่มการโทรกลับหลายครั้งการโทรกลับล้มเหลว ฯลฯ ทั้งหมดนี้โดยไม่จำเป็นต้องแก้ไขgetData()ฟังก์ชันดั้งเดิม การแยกฟังก์ชัน AJAX ออกจากชุดของการดำเนินการที่จะทำให้เสร็จหลังจากนั้นเป็นสิ่งที่ดี!.

การรอการตัดบัญชียังช่วยให้สามารถซิงโครไนซ์เหตุการณ์แบบอะซิงโครนัสหลายรายการได้ง่ายขึ้นซึ่งคุณไม่สามารถทำได้ง่ายๆ success:

ตัวอย่างเช่นฉันสามารถเพิ่มการโทรกลับหลายรายการตัวจัดการข้อผิดพลาดและรอให้ตัวจับเวลาผ่านไปก่อนดำเนินการต่อ:

// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);

// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);

$.when(timer, ajax).done(function() {
    // this won't be called until *both* the AJAX and the 5s timer have finished
});

ajax.done(function(data) {
    // you can add additional callbacks too, even if the AJAX call
    // already finished
});

ส่วนอื่น ๆ ของ jQuery ก็ใช้ออบเจ็กต์ที่รอการตัดบัญชีเช่นกัน - คุณสามารถซิงโครไนซ์ภาพเคลื่อนไหว jQuery กับการดำเนินการ async อื่น ๆ ได้อย่างง่ายดาย


1
@Cerbrus ดูตัวอย่างใหม่แล้วพิจารณาว่าคุณจะทำอย่างไรโดยไม่มีวัตถุรอการตัดบัญชี
Alnitak

@jbl วัตถุรอการตัดบัญชีนั้นยอดเยี่ยมมาก โดยปกติฉันจะลงคะแนนคำตอบใด ๆ ที่ส่งเสริมการใช้success:เนื่องจากการรอการตัดบัญชีทำงานได้ดีขึ้นมาก
Alnitak

@Cerbrus นั่นคือสิ่งที่ควรจะตีความ ขอแนะนำให้คุณค้นหาที่นี่สำหรับuser:6782 deferredสำหรับจำนวนมากตัวอย่างเพิ่มเติม
Alnitak

เราจะใช้สิ่งนี้กับกิจกรรมส่งแบบฟอร์มได้อย่างไร
haakym

ว่าalertแต่ ... ผมเองต้องการใช้console.log(data)หรือถ้ามันเป็นอาร์เรย์: console.table(data):)
Armstrongest

16

ฉันไม่รู้ว่าทำไมคุณถึงกำหนดพารามิเตอร์นอกสคริปต์ นั่นเป็นสิ่งที่ไม่จำเป็น ฟังก์ชันเรียกกลับของคุณจะถูกเรียกโดยมีข้อมูลส่งกลับเป็นพารามิเตอร์โดยอัตโนมัติ เป็นไปได้มากที่จะกำหนดการเรียกกลับของคุณนอกsucess:IE

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

ฟังก์ชัน handleData จะถูกเรียกใช้และพารามิเตอร์ส่งผ่านไปยังฟังก์ชัน ajax


6

ลองเขียนตัวจัดการความสำเร็จของคุณใหม่เป็น:

success : handleData

คุณสมบัติความสำเร็จของเมธอด ajax ต้องการการอ้างอิงถึงฟังก์ชันเท่านั้น

ในฟังก์ชัน handleData ของคุณคุณสามารถรับได้ถึง 3 พารามิเตอร์:

object data
string textStatus
jqXHR jqXHR

5

ฉันจะเขียน:

var handleData = function (data) {
    alert(data);
    //do some stuff
}


function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

15
รหัสของคุณไม่เคยใช้จริงdataFromServerเพื่อให้สามารถลบบรรทัดแรกได้
Anthony Grist

2

คุณไม่จำเป็นต้องประกาศตัวแปร ฟังก์ชั่นความสำเร็จของ Ajax รับพารามิเตอร์สูงสุด 3 ตัวโดยอัตโนมัติ:Function( Object data, String textStatus, jqXHR jqXHR )


ต้องใช้เวลาสักพักเพื่อค้นหาพารามิเตอร์เริ่มต้นเหล่านั้น ขอบคุณ!
payne

2

หลังจากไม่กี่ชั่วโมงเล่นกับมันและเกือบจะน่าเบื่อ ปาฏิหาริย์มาหาฉันมันได้ผล

<pre>


var listname = [];   


 $.ajax({
    url : wedding, // change to your local url, this not work with absolute url
    success: function (data) {
       callback(data);
    }
});

function callback(data) {
      $(data).find("a").attr("href", function (i, val) {
            if( val.match(/\.(jpe?g|png|gif)$/) ) { 
             //   $('#displayImage1').append( "<img src='" + wedding + val +"'>" );
                 listname.push(val);
            } 
        });
}

function myfunction() {

alert (listname);

}

</pre>

1
คุณไม่จำเป็นต้องเรียกใช้ฟังก์ชันอื่นเพื่อความสำเร็จ คุณสามารถพูดได้โดยตรงว่าsuccess : callbackjquery จะเรียกใช้ฟังก์ชันของคุณที่เรียกcallbackด้วยdataพารามิเตอร์ในนั้น
Olgun Kaya

-1

ในส่วนประกอบของคุณเช่นรหัส JS เชิงมุม:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.