Причина, по которой вы видите undefined
, заключается в том, что ajax-запросы по умолчанию асинхронны. Это означает, что ваш метод get
вызывается, и поток кода перемещается вниз к следующему оператору, пока запрос выполняется в фоновом режиме. Ваша функция обратного вызова вызывается позже, когда запрос завершается.
Использование функций обратного вызова является распространенным шаблоном, используемым в подобных ситуациях. Но вы, кажется, говорите, что не хотите или не можете этого делать. В этом случае вы можете использовать async: false
, что заставит запрос быть синхронным. Имейте в виду, однако, что ваш код будет заблокирован по запросу, и если это долгоживущий запрос, пользовательский интерфейс будет ухудшаться по мере блокировки браузера.
P.S. Вам не нужно parseJSON
- если в ответе задан правильный тип mime-типа, jQuery будет автоматически определять тип и автоматически анализировать JSON. И в случае, если сервер не отправляет обратно правильный MIME-тип, вы также можете явно указать jQuery, каков ожидаемый тип возвращаемых данных; см. аргумент dataType
для $.get()
.
Один из способов изменения кода для принудительного выполнения синхронных запросов:
$.ajax({
type: 'GET',
url: 'data/partners.json',
success: function(file){
partnerData = $.parseJSON(file);
//ideally you would perform a callback here
//and keep your requests asynchronous
},
dataType: 'json',
async: false
});