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, и будет вызвана ваша функция обратного вызова. Это запускает совершенно новый поток выполнения. Попробуйте представить их как два совершенно отдельных исполнения, один вызов до ajax и один вызов после 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 значение 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

Функция вызывается асинхронно — это означает, что часть обратного вызова выполняется в какой-то момент в будущем, в то время как ваша основная функция 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? edit видимо я ошибся, извините :) - person Andrei Serdeliuc ॐ; 24.08.2010
comment
Анонимная функция является обратным вызовом и будет вызываться только после возврата getAreas. - person Skilldrick; 24.08.2010
comment
Речь идет не о том, чтобы определить синхронность и асинхронность. - person Kristoffer Sall-Storgaard; 24.08.2010