Сохранение в jquery .getJSON()

#jquery #json #persistence #getjson

#jquery #json #сохранение #getjson

Вопрос:

Я использую .getJSON для отправки поискового запроса на мой PHP-сервер и возвращаю массив, который был json_encode’d. Я хотел бы использовать результирующий объект после завершения функции jQuery (в идеале, поместив его в массив, и использовать его как любой другой объект в другом месте страницы.

Но объект перестает существовать после завершения функции. Это успех:

   var widgets = new Array();

  $.getJSON('/server.php', {query: search.value}, function(response) {
    widgets.push(response);
    alert('value of result's attribute1 is '   widgets[widgets.length].attribute1);
  });
  

Однако, как только я покидаю функцию, widgets.push[длина] становится нулевым, и я не могу получить доступ ни к чему о перемещаемом объекте. Я бы подумал, что это будет копия, а не ссылка?

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

Комментарии:

1. Какова область widgets ? Является ли это (и ваш вызов getJSON ) внутри другой функции? Попробуйте удалить var перед widgets = new Array() ; это гарантирует, что вы создаете глобальную переменную (при условии, что widgets она не объявлена во внешней области видимости).

2. Извините, должен был объяснить — виджеты являются глобальными, первое объявление в <script> . И да, этот вызов .getJSON запускается при добавлении результата в текстовое поле автозаполнения (поисковое значение, поступающее оттуда).

3. Хорошо, тогда откуда вы попытаетесь получить доступ widgets позже?

4. Доступ происходит после создания второго виджета … и так далее по мере добавления новых виджетов в массив. Согласны ли вы, что widgets.push должен быть выполнен успешно, если он помещен в обратный вызов .getjson’s success?

Ответ №1:

Я думаю, что вы проверяете неправильный индекс массива.

 widgets[widgets.length - 1]
  

Это могут быть другие вещи… но это может быть именно так.

Комментарии:

1. Это верно — индекс также был неправильным. Ошибка в моей транскрипции.

Ответ №2:

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

Вам нужно убедиться, что любые манипуляции с виджетами происходят после завершения getJSON.

Часть синтаксиса getJSON позволяет добавлять функцию обратного вызова при успешном выполнении. Смотрите http://api.jquery.com/jQuery.getJSON /. Поместите ВЕСЬ код управления вашим виджетом в «успех».

Комментарии:

1. Спасибо, это то, что я ищу — все идет в обратный вызов ‘success’.

Ответ №3:

Создание «маленького» виджета, необходимого для загрузки результатов jsonP (содержимого виджета) в контейнер виджета….

У меня это работает …. ах-раз, ах-два, ах-три и четыре….

  1. глобальная переменная «array»

     var widgetContents = []; 
      
  2. запрос в формате json….

     $.getJSON(jsonp_url, function(results) { 
        $.each(results,  function(i, value) {                      
        widgetContents[i] = value;                          
    
        // console.log( i   " => "   value);
        });
            var success = true;                                     
    });
      
  3. проблемы с отладкой или обнаружением…

     if ( widgetContents.length == 0 || success != true ) { 
        alert("Opps... something went wrong in the backroom....");
    }
      
  4. результаты обработки….

     else {
           $.each(widgetContents, function(index, value) {                         
                $('#'   contentsID).append(value);
    
                /* or whatever you need to do....   */                      
           });
    }