Вопрос о области видимости переменных JavaScript - PullRequest
4 голосов
/ 10 июля 2011

Может кто-нибудь сказать мне, почему это предупреждение пусто?

var pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
    $.each(data, function(key, val) {
    pending_dates.push({'event_date' : val.event_date});
    });
});
alert(pending_dates);

Я не могу обойти это.Разве я не объявляю pending_dates глобальной переменной, доступной в каждом цикле?Как решить эту проблему?

Обратите внимание, что вывод JSON работает хорошо.Если бы я объявлял даты ожидания в getJSON function (и оповещения в этой функции), это работает, но мне нужно хранить данные в массиве вне этой getJSON функции.

Спасибо за ваш вклад.

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

Благодаря вашим комментариям этот код работает:

    pending_dates = [];
    $.getJSON('/ajax/event-json-output.php', function(data) {
        $.each(data, function(key, val) {
            pending_dates.push({'event_date' : val.event_date});
        });
    }).success(function() { alert(pending_dates); })

Большое спасибо за ваш вклад!

Ответы [ 5 ]

4 голосов
/ 10 июля 2011

Я думаю, что проблема в том, что $.getJSON является асинхронным вызовом - он немедленно возвращается, а затем вызывается alert(pending_dates).

Однако, когда это происходит, ответ от асинхронного вызова, возможно, не был получен, и, следовательно, pending_dates, возможно, не был заполнен.

Возможно, поэтому он пуст во время вызова alert(pending_dates).

3 голосов
/ 10 июля 2011

Ваше оповещение выполняется до завершения вызова JSON.Запомните этот JSON, который он выбирает и обрабатывает асинхронно, но ваше предупреждение приходит сразу после его запуска.Если вы хотите получить предупреждение, вам нужно поставить его по завершении вызова getJSON.

2 голосов
/ 10 июля 2011

$.getJSON работает асинхронно, что означает, что все, что вы указали в обратном вызове, будет выполнено в конце концов, но нет никакой гарантии, что это произойдет к тому времени, когда вы достигнете alert('pending_dates').

Вы можете проверить это, нажав alert('pending_dates') сразу после
pending_dates.push() (это приведет к отображению одного предупреждения для каждого извлекаемого элемента).

Вы можете написать функцию, чтобы начать работу с данными, которые вы извлекаете, как только они станут доступны:

var pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
    $.each(data, function(key, val) {
        pending_dates.push({'event_date' : val.event_date});
        doSomething(val.event_date);
    });
});

function doSomething(date) {
    // do something with date
    // like writing it to the page
    // or displaying an alert
}

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

0 голосов
/ 10 июля 2011

Скорее всего, ответ AJAX не возвращает никаких данных. Можете ли вы попробовать нажать 'foo' на массив и посмотреть, показывает ли предупреждение что-то другое?

0 голосов
/ 10 июля 2011

Переменные являются глобальными по умолчанию в Javascript - наличие var фактически вводит область действия. Удалите это и посмотрите, поможет ли это.

...