Установить для глобальной переменной javascript значение JSONresult?

Как установить глобальную переменную js в результирующий набор json в событии onload?

    var global = [];

    $.getJSON("<%: Url.Action("myUrl", "con") %>/", 
     function(data) {
           $.each(data, function(key, val) {
             global.push(val);
           });
    });

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

4 ответа

Решение

Снова ты. Может быть попробовать

var result;
$.ajax({
    url: '<%: Url.Action("myUrl", "con") %>/',
    dataType: 'json',
    async: false,
    success: function(data) {
        result = data;
    }
});
// process result here

Как указывает @marc (косвенно), вы должны понимать природу вызова ajax и модель события. Вызов ajax выполняется, как только файл JS будет проанализирован, и результат будет возвращен асинхронно. Итак, ваша временная шкала кода будет выглядеть

00 set global = []
01 AJAX call /someurl/ -------------------\
02 check global /* it's empty */           \
03 do something else                  [process AJAX call on server, send result]
...                                         /
42 AJAX call is completed <----------------/
43 call  success ----------------------------------> global.push(result)
44 at this point of time you can access global

Это временная шкала, а не порядок исполнения. Время между вызовом AJAX и ответом может быть произвольным, включая случай таймаута или ошибки на стороне сервера

Итак, что нужно делать?

1) нормальное решение для JS - обратный вызов, функция успеха, которую вы уже имеете, может либо

1.1) установить глобальный и вызвать другую функцию, или

1.2) делать нужные действия с данными

2) событие - лучше, если вы предполагаете использовать данные в нескольких частях кода, читайте механизм событий jQuery

3) синхронный вызов, как предлагает @marc - этого следует избегать в 99% случаев. Единственный известный мне случай, когда это может понадобиться, - это когда вам необходимо запросить обязательные данные из стороннего источника, и даже в этом случае вы можете сделать это на сервере (хотя по крайней мере приемлем синхронный AJAX)

Вам не нужно устанавливать глобальный массив. Просто назначьте значение.

var global = null;

    $.getJSON("<%: Url.Action("myUrl", "con") %>/", 
     function(data) {
           $.each(data, function(key, val) {
             global = val;
           });
    });

Этот код должен работать просто отлично. ( Живое копирование) Похоже, есть проблема с вызовом ajax, который не возвращает данные в ожидаемой вами форме.

Другие вопросы по тегам