2013-09-13 4 views
1

У меня возникли проблемы с использованием объекта JSON за пределами области успеха AJAX. Мне нужно получить доступ к возвращенному объекту JSON за пределами области успеха AJAX. Я попытался инициализировать JS var вне области AJAX и назначить JSON. Однако этот подход приводит к ошибке catalog.item is undefined. Я ценю любые предложения, которые помогут мне исправить эту проблему.Невозможно получить доступ к объекту JSON за пределами успеха AJAX

Это то, что я пробовал:

Этот подход отлично работает (но не то, что мне нужно):

  $('.catViewButton').click(function(){ 
       var overlay = jQuery('<div class="overlay"> </div>'); 
       overlay.appendTo(".invoice-body"); 
       $('.catalog-view-wrapper').show(); 
       $.ajax({ 
        url: "ajax/invoice-get-data.php?loadCatalog=1", 
        dataType: "json", 
        success: function(catalog){ 
         alert(catalog.item[0].image); 
         $('.catalog-img-container').attr("src", catalog.item[0].image); 
        } 
       }); 

         ...more code 
         ..... 
         ..... 

Этот подход является то, что мне нужно, но приводит к ошибке:

 var catalog = []; 
     $('.catViewButton').click(function(){ 
      var overlay = jQuery('<div class="overlay"> </div>'); 
      overlay.appendTo(".invoice-body"); 
      $('.catalog-view-wrapper').show(); 
      $.ajax({ 
       url: "ajax/invoice-get-data.php?loadCatalog=1", 
       dataType: "json", 
       success: function(cat){ 
        catalog = cat; 
       } 
      }); 
      alert(catalog.item[0].image); 
      $('.catalog-img-container').attr("src", catalog.item[0].image); 
        ...more code 
        ..... 
        ..... 

Большое спасибо заранее!

+1

не дубликат. программист должен понимать разницу между асинхронными и синхронными вызовами с помощью jquery ajax –

+1

@JamesMontagne - Felix уверен, что на нем много трафика. – adeneo

+2

@AkshayKhandelwal - это acronomym для «*** асинхронного *** Javascript и XML» по какой-то причине! – adeneo

ответ

3

Вы можете использовать Deferred Object, который занимается асинхронными вызовами для вас. Выполнение этого кода будет выполняться в порядке чтения, независимо от того, когда ответ отправлен обратно. Вы можете добавить столько обратного вызова, как вам нужно:

jqxhr = $.ajax({ 
    url: "ajax/invoice-get-data.php?loadCatalog=1", 
    dataType: "json" 
}); 
jqxhr.done(function(catalog) { 
    alert(catalog.item[0].image); 
    $('.catalog-img-container').attr("src", catalog.item[0].image); 
}); 
jqxhr.done(function(catalog) { 
    // use catalog again 
}); 

документация полна примеров о том, что все: http://api.jquery.com/jQuery.ajax/.

1

Здесь важно, чтобы a из ajax. Асинхронный означает alert, а последующие линии .attr() работают до того, как будет выполнен обратный вызов вашего успеха. Вы действительно должны помещать эти строки в обратный вызов успеха.

+0

Спасибо за ответ. Но что, если мне нужно использовать содержимое объекта JSON за пределами обратного вызова успеха? Есть ли способ обойти это? – AnchovyLegend

+0

@AnchovyLegend Затем вы все равно должны ждать, пока не будет выполнен успешный обратный вызов. Об этом нет. Ваш код не обязательно должен быть включен в обратный вызов успеха, но он должен быть в функции, которая запускается либо путем обратного вызова успеха, либо после обратного вызова успеха. –

+0

@ AnchovyLegend Да, есть способ обойти эту проблему: см. Мой ответ. Как отметили несколько пуристов, это кудряк, но он работает. (Является ли это правильным для вас, зависит от объема трафика, получаемого вашим веб-приложением. Не каждый webapp - это Google Mail ... Я использую метод все время, как и другие, которые его преподавали мне.) – gibberish

0

Это как работает AJAX. Результаты, возвращаемые функции success:, являются локальными для этой функции.

Если вам необходимо получить доступ к ним вне зависимости успеха, один вариант, чтобы сохранить их в элементе - такие как скрытый <input> поле, как этот:

Предположив скрытое поле ввода, как это:

<input type="hidden" id="myHiddenField" /> 

Пересмотренный AJAX

$.ajax({ 
    url: "ajax/invoice-get-data.php?loadCatalog=1", 
    dataType: "json", 
    success: function(catalog){ 
     $('#myHiddenField').val(catalog); 
     $('#myHiddenField').trigger('blur'); 
    } 
}); 

Вне функции AJAX:

$('#myHiddenField').blur(function() { 
    var cat = $(this).val(); 
    //now do something with the data in var cat 
}); 
+1

Я отказался от того, что вы изменил DOM для хранения данных JS. Вам не нужно это делать, и это не очень эффективно. – Vlad

+0

Как еще вы это сделаете? Оккамская бритва: это просто, и это работает. – gibberish

+1

Зачем вам нужно хранить его в другом элементе для этого? вы могли бы jus tas создать объект, связать событие с этим объектом и затем запустить там событие. Или еще лучше, использовать встроенный интерфейс обещаний. –

Смежные вопросы