Jquery ส่งคืนข้อมูลการโพสต์

ตกลงฉันมีฟังก์ชั่นนี้:

function getAreas(){
      $.post("/custom_html/weathermap.php",'',
            function(data){

                return data

            }, "json");


}

ซึ่งทำงานได้ดี ตอนนี้สิ่งที่ฉันพยายามทำคือส่งข้อมูลกลับไปยังตัวแปร กล่าวคือ:

var data=getAreas()

แต่มันไม่คืนอะไรเลย มีวิธีทำให้มันใช้งานได้ไหม?

ขอบคุณล่วงหน้าสำหรับความช่วยเหลือใด ๆ


person lolla    schedule 24.08.2010    source แหล่งที่มา


คำตอบ (4)


มันเป็นการโทรแบบอะซิงโครนัส ดังนั้นคุณจึงไม่สามารถกลับจากการโทรแบบนั้นได้

คุณจะต้องย้ายโค้ดที่ทำบางอย่างด้วย data ไปยังฟังก์ชันโทรกลับ (function(data){})

function getAreas(){
      $.post("/custom_html/weathermap.php",'',
            function(data){

                //do something with data here, such as calling another function

            }, "json");
}

อาจต้องใช้เวลาสักระยะกว่าจะคิดแบบอะซิงโครนัสได้ แต่คุณจะแก้ปัญหาได้ โดยพื้นฐานแล้ว บิตของโค้ดที่ส่งคำขอจะเสร็จสิ้นเมื่อมีการส่งคำขอ เธรดการดำเนินการนั้นจะเสร็จสิ้น และเบราว์เซอร์ของคุณก็จะนั่งเฉยๆ โดยไม่ทำอะไรเลย จากนั้นการโทร $.post จะได้รับข้อมูลกลับมาจาก weathermap.php และฟังก์ชันการโทรกลับของคุณจะถูกเรียกใช้ นั่นเป็นการเริ่มต้นเธรดการดำเนินการใหม่ทั้งหมด ลองคิดว่ามันเป็นสองการประมวลผลที่แยกจากกันโดยสิ้นเชิง การเรียก pre-ajax หนึ่งครั้งและการเรียก post-ajax หนึ่งครั้ง

นี่คือความดีของ ASCII บางส่วน:

       V
       |
User clicks button
(or something else happens)
       |
       |
Your JavaScript runs   
       |
       |
And eventually gets
to the ajax call     -------> SERVER ------>     Server sends data back
                                                           |
                                                           |
                                                 And your callback is run
                                                 on the data and execution
                                                 continues from here
                                                           |
                                                           |
                                                           V
person Skilldrick    schedule 24.08.2010

คุณสามารถเก็บถาวรได้โดยการตั้งค่า async เป็นเท็จ

jQuery.loadView = function(url,data){
    var idata;
    $.ajax({
      type: 'POST',
      url: url,
      data: data,
      dataType: 'html',
      async: false,
      success: function(result){idata = result;}
    });
    return idata;
}
person angry kiwi    schedule 17.06.2011

ฟังก์ชันนี้ถูกเรียกแบบอะซิงโครนัส ซึ่งหมายความว่าส่วนการเรียกกลับจะถูกดำเนินการในอนาคต ในขณะที่ฟังก์ชัน getAreas() หลักของคุณจะกลับมาในทันที ในกรณีนี้ จะไม่ส่งคืนสิ่งใดเลยเนื่องจากคุณไม่มีคำสั่ง return ในฟังก์ชันหลัก

เพื่อให้สิ่งนี้ได้ผล คุณต้องแยกโค้ดของคุณออกเป็นสิ่งที่ต้องทำก่อนที่จะเรียก getAreas() และสิ่งที่จะเกิดขึ้นหลังจากนั้น

จากนั้นคุณอาจได้สิ่งที่ชอบ:

function getAreas(){ $.post("/custom_html/weathermap.php",'', onGetAreasComplete, "json");
}

function onGetAreasComplete(data)
{
    // do whatever you need to do with data
}


// do whatever you need to do before getAreas()

getAreas();

หวังว่าจะสมเหตุสมผล

person Tim Rogers    schedule 24.08.2010

ลองสิ่งนี้

function getAreas(){
    var ret;
    $.post("/custom_html/weathermap.php",'', function(data){

            ret = data;

        }, "json");

    return ret;
}
person Andrei Serdeliuc ॐ    schedule 24.08.2010
comment
ขอบเขตของฟังก์ชันที่ไม่ระบุตัวตนไม่ใช่ขอบเขตเดียวกันกับ getAreas ใช่หรือไม่ แก้ไข เห็นได้ชัดว่าฉันผิด ขออภัย :) - person Andrei Serdeliuc ॐ; 24.08.2010
comment
ฟังก์ชันที่ไม่ระบุชื่อเป็นการเรียกกลับ และจะถูกเรียกหลังจาก getAreas กลับมาแล้วเท่านั้น - person Skilldrick; 24.08.2010
comment
นี่ไม่เกี่ยวกับการกำหนดขอบเขตเกี่ยวกับซิงโครนัสกับอะซิงโครนัส - person Kristoffer Sall-Storgaard; 24.08.2010