Установить для глобальной переменной 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, который не возвращает данные в ожидаемой вами форме.