Jquery вернуть данные поста - PullRequest
       30

Jquery вернуть данные поста

3 голосов
/ 24 августа 2010

Хорошо, поэтому у меня есть эта функция:

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

                return data

            }, "json");


}

, которая отлично работает.теперь я пытаюсь передать данные обратно в переменную, другими словами:

var data=getAreas()

, но она ничего не возвращает.Есть ли способ заставить это работать?

Заранее спасибо за любую помощь.

Ответы [ 4 ]

13 голосов
/ 24 августа 2010

Это асинхронный вызов, поэтому вы не можете так с него ответить.

Вам нужно переместить код, который что-то делает с 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
6 голосов
/ 17 июня 2011

Вы можете заархивировать это, установив 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;
}
2 голосов
/ 24 августа 2010

Функция вызывается асинхронно - это означает, что часть обратного вызова выполняется в какой-то момент в будущем, в то время как ваша основная функция 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();

Надеюсь, что это имеет смысл.

0 голосов
/ 24 августа 2010

Попробуйте это

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

            ret = data;

        }, "json");

    return ret;
}
...