Устойчивост в jquery .getJSON()

Използвам .getJSON, за да изпратя заявка за търсене до моя PHP сървър и връщам масив, който е json_encoded. Бих искал да използвам получения обект, след като функцията 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[length] става null и не мога да получа достъп до нищо за избутания обект. Мисля, че това ще бъде копие, а не справка?

Моето приложение включва потребителят да извърши няколко от тези търсения, за да създаде списък с уиджети и след това да работи между атрибутите на всеки обект. Има ли приет начин тези данни да бъдат постоянни след завършване на функцията?


person Ryan    schedule 03.06.2011    source източник
comment
Какъв е обхватът на widgets? Това ли е (и вашето извикване на getJSON в друга функция? Опитайте да изпуснете var пред widgets = new Array(); това ще гарантира, че създавате глобална променлива (стига widgets да не е декларирана във външен обхват).   -  person josh3736    schedule 03.06.2011
comment
Съжалявам, трябваше да обясня - джаджите са глобални, първата декларация в ‹script›. И да, това извикване на .getJSON се задейства при добавяне на резултат към текстово поле за автоматично попълване (search.value идва от там).   -  person Ryan    schedule 03.06.2011
comment
Добре, тогава откъде се опитвате да получите достъп до widgets по-късно?   -  person josh3736    schedule 03.06.2011
comment
Достъпът се осъществява, след като е създадена втора джаджа... и така нататък, докато в масива се натискат още джаджи. Съгласни ли сте, че widgets.push трябва да успее, ако бъде поставен в обратното извикване за успех на .getJSON?   -  person Ryan    schedule 03.06.2011


Отговори (3)


Извикването getJSON се извършва асинхронно или независимо от останалата част от вашия JavaScript. Проблемът ви най-вероятно е, защото вашето извикване на getJSON не е завършено, преди да се опитате да манипулирате масива си с джаджи.

Трябва да се уверите, че всяка манипулация на джаджи се извършва след завършване на getJSON.

Част от синтаксиса на getJSON ви позволява да добавите функция за обратно извикване, когато извикването е успешно. Вижте http://api.jquery.com/jQuery.getJSON/. Поставете ЦЕЛИЯ си код за манипулиране на джаджи в „успех“.

person kittyhawk    schedule 03.06.2011
comment
Благодаря ви, това е, което търся - всичко отива в обратното извикване „успех“. - person Ryan; 03.06.2011

Мисля, че проверявате грешен индекс на масива.

widgets[widgets.length - 1]

Може да има други неща... но това може да е.

person natedavisolds    schedule 03.06.2011
comment
Така е - индексът също беше грешен. Грешка в моята транскрипция. - person Ryan; 03.06.2011

Изграждане на „малка“ джаджа и необходимост за зареждане на jsonP резултатите (съдържание на джаджа) в контейнера за джаджа....

Това работи за мен... а-едно, а-две, а-три и четири....

  1. глобалната променлива "масив".

    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....   */                      
           });
    }
    
person Bill Warren    schedule 20.07.2013