вызов переменной вне функции .getJSON?

Я пытаюсь вызвать переменную вне функции .getJSON. Я объявляю его вне функции .getJSON, а затем присваиваю ему значение внутри функции .getJSON. Однако, когда я пытаюсь вытащить его после, он говорит, что он пуст (когда я вижу в журнале консоли, что в нем есть информация). Вот код:

function calcRoute() {
    var start = document.getElementById('start').value;
    var end = document.getElementById('end').value;
    var waypts = [];
    $.getJSON("/westcoast_map.php", // The server URL
      { westcoast_id : $('.opener').data('westcoast_id') }, // Data you want to pass to the server.
      function(json) {
        waypts = json[1];
        console.log(waypts); //prints out full array
      });
    console.log(waypts); //prints out an empty array

person user1072337    schedule 01.03.2013    source источник
comment
возможный дубликат Как вернуть ответ из вызова AJAX из функции?   -  person Musa    schedule 02.03.2013
comment
Да, в значительной степени. Отмечено. @ user1072337 этот пост очень подробно ответит на ваш вопрос.   -  person Leeish    schedule 02.03.2013


Ответы (2)


Я не помню, как это называется, но это вопрос времени. getJson является асинхронным. Таким образом, ваш javascript обрабатывает часть после запроса JSON до того, как запрос JSON сможет вернуться. Вам нужно вызвать функцию внутри полной функции и передать ее.

var waypts = [];
$.getJSON("/westcoast_map.php", // The server URL
    { westcoast_id : $('.opener').data('westcoast_id') }, // Data you want to pass to the server.
    function(json) {
        waypts = json[1];
        console.log(waypts); //prints out full array
        runCodeAfter();
    });
function runCodeAfter(){
    console.log(waypts); //should print out full array.
}
person Leeish    schedule 01.03.2013
comment
вспомогательный ответ находится здесь: stackoverflow.com/questions/5935968/ - person user1063287; 30.09.2013

В JavaScript область действия переменной действительна только внутри функции, поэтому вы не можете получить доступ к переменным waypts вне функции calcRoute.

Если вы хотите это сделать, вы должны объявить переменную waypts вне функции.

РЕДАКТИРОВАТЬ:

если вы не хотите выполнять некоторые после получения ответа на вызов ajax, вы можете сделать это с помощью jQuery:

    function calcRoute() {
        var start = document.getElementById('start').value;
        var end = document.getElementById('end').value;
        var waypts = [];
        var data = $.getJSON("/westcoast_map.php",
          { westcoast_id : $('.opener').data('westcoast_id') });
      $.when(data).then(function(theData){
         waypts = theData[1];
      });
   }
person thitemple    schedule 01.03.2013
comment
я использую именно это, за исключением того, что я заменяю данные на json... он говорит, что функция объекта (j, s) {return new b.fn.init (j, s)} не имеет метода "когда" - person user1072337; 02.03.2013
comment
Какую версию jQuery используете? Метод when доступен после версии 1.5. Попробуйте опубликовать обновленный код на jsfiddle. - person thitemple; 02.03.2013