jQuery Async Issue, присвоение переменной после запроса GET - PullRequest
2 голосов
/ 08 сентября 2011

Я уверен, что решение смотрит мне прямо в глаза, но я просто не вижу его.Я пытаюсь загрузить объект из внешнего источника файла.Я пробовал несколько способов, используя встроенные методы jQuery, но продолжаю возвращать undefined.Является ли моя проблема сферой?Мне нужно partnerData прямо там, где оно есть из-за других зависимых методов в моем скрипте.Я не хочу управлять остальными функциями моего сайта из обратного вызова $.get.Любая помощь с благодарностью, вот код:

$(function() {

    var partnerData;

    $.get('data/partners.json', function(file) {
        partnerData = $.parseJSON(file);
    });

    console.log(partnerData); /* returns undefined instead of object */

});

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

Спасибо за все отзывы всех.Вот решение, которое я выбрал:

var partnerData;

$.ajax({
    url: 'data/partners.json',
    dataType: 'json',
    async: false,
    success: function(data) {
        partnerData = data;
    }
});

Ответы [ 4 ]

5 голосов
/ 08 сентября 2011

Причина, по которой вы видите 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
});
1 голос
/ 08 сентября 2011

console.log в синхронном режиме и получить асинхронно.

try:

$(function() {
    var partnerData;

    $.get('data/partners.json', function(file) {
        partnerData = $.parseJSON(file);
        test();
    });

    function test(){
        console.log(partnerData); 
    }
});
1 голос
/ 08 сентября 2011

Я бы сказал, что ваша проблема аналогична той, которую я только что решил, если $ .get - AJAX!и это установка переменной, чтобы прочитать эту переменную вне обратного вызова, вам нужно дождаться ответа!Так что вы должны установить async = false!

1 голос
/ 08 сентября 2011
Функция

обрабатывается до конечного события, когда еще обрабатывается ajax. вставить его в функцию обратного вызова

$(function() {
    var partnerData;
    $.get('data/partners.json', function(file) {
        partnerData = $.parseJSON(file);
        console.log(partnerData);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...