Jquery mengembalikan data posting

Oke jadi saya punya fungsi ini:

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

                return data

            }, "json");


}

yang berfungsi dengan baik. sekarang yang saya coba lakukan adalah meneruskan data kembali ke variabel, dengan kata lain:

var data=getAreas()

tapi itu tidak mengembalikan apa pun. apakah ada cara agar ini berfungsi?

Terima kasih sebelumnya atas bantuan apa pun.


person lolla    schedule 24.08.2010    source sumber


Jawaban (4)


Ini adalah panggilan asinkron, jadi Anda tidak dapat kembali lagi seperti itu.

Anda harus memindahkan kode yang melakukan sesuatu dengan data ke dalam fungsi panggilan balik (function(data){}).

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

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

            }, "json");
}

Butuh beberapa saat untuk memahami cara berpikir yang tidak sinkron, tetapi Anda akan berhasil. Pada dasarnya, sedikit kode yang mengirimkan permintaan dilakukan setelah permintaan dikirim. Rangkaian eksekusi tersebut akan selesai, dan browser Anda hanya akan diam di sana, tidak melakukan apa pun. maka panggilan $.post akan mengambil data kembali dari weathermap.php, dan fungsi panggilan balik Anda akan dipanggil. Itu memulai rangkaian eksekusi baru. Cobalah untuk menganggapnya sebagai dua eksekusi yang benar-benar terpisah, satu panggilan pra-ajax dan satu panggilan pasca-ajax.

Inilah beberapa kebaikan 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

Anda dapat mengarsipkannya dengan menyetel async ke false

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

Fungsi ini dipanggil secara asinkron - itu berarti bahwa bagian panggilan balik dieksekusi di beberapa titik di masa depan sementara fungsi getAreas() utama Anda segera kembali. Dalam hal ini, ia tidak mengembalikan apa pun karena Anda tidak memiliki pernyataan return di fungsi utama Anda.

Agar ini berfungsi, Anda perlu memisahkan kode Anda menjadi apa yang perlu terjadi sebelum Anda memanggil getAreas() dan apa yang terjadi setelahnya.

Maka Anda mungkin mendapatkan sesuatu seperti:

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

Harapan itu masuk akal.

person Tim Rogers    schedule 24.08.2010

Coba ini

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

            ret = data;

        }, "json");

    return ret;
}
person Andrei Serdeliuc ॐ    schedule 24.08.2010
comment
Bukankah cakupan fungsi anonim sama dengan cakupan getArea? edit rupanya saya salah, maaf :) - person Andrei Serdeliuc ॐ; 24.08.2010
comment
Fungsi anonim adalah panggilan balik, dan hanya akan dipanggil setelah getAreas kembali. - person Skilldrick; 24.08.2010
comment
Ini bukan tentang pelingkupan tentang sinkron vs asinkron. - person Kristoffer Sall-Storgaard; 24.08.2010