2010-12-13 2 views
0

У меня есть объект JSON, который заполнен XHR. Затем мне нужно обновить этот объект со значениями из отдельного вызова XHR. Проблема, с которой я сталкиваюсь, - это второй вызов, который не выполняется в правильное время, и я думаю, что это проблема с тем, как я структурировал свой объект. Вот что у меня есть:JSON Object XHR и замыкания

function Proprietary() 
{ 
    var proprietary= this; 
    this.Groups = {}; 
    this.getGroups = function() 
    { 
    $.getJSON(group_url, function(data){proprietary.callReturned(data);}); 

    } 


    this.callReturned = function(data) 
    { 
    //Do stuff 
    for(var i=0; i< data.groups.length; i++) 
    { 
    insparq.Groups[i] = data.groups[i]; 
    $.getJSON(participant_url, function(p){proprietary.Groups[i].participants = p;}); 
    } 

//the function call below is the action I want to occur after the object is populated. 
    PopulateGroups(); 
    } 

}; 
+0

Я думаю, что вы назвали переменную, называемую «проприетарной» в функции «запатентованная», могут вызвать некоторые проблемы, не так ли? –

+1

'PopulateGroups' вызывается до того, как все' $ .getJSON (member_url ... '). Вам нужно проверить, сколько участников вы загружаете, используя внешний счетчик и проверяя его на размер' private.Groups' внутри '$ .getJSON (member_url ...' функция обратного вызова и только тогда, когда они равны, вы должны называть 'PopulateGroups'. –

+0

Спасибо, Horia. Где/как увеличивать счетчик? –

ответ

1

В этом фрагменте кода, похоже, есть несколько странных вещей.

Прежде всего, $ .getJSON (...) принимает третий параметр, который является вашим обратным вызовом. Второй параметр - данные. Я думаю, что вы передаете функцию в качестве параметра данных. Вам нужно будет исправить это в обоих местах. Если вам не нужно ничего пропускать, просто введите свой второй параметр в пустой объект {}.

Вот один общий способ, которым вы можете выполнить обратный вызов после того, как ВСЕ ваши XMLHttpRequests вернулись с сервера.

this.callReturned = function(data) { 

    var countdown = data.groups.length; 
    function callback() { 
     if(countdown-- === 1) { 
      PopulateGroups(); 
     } 
    } 

    for(var i=0; i< data.groups.length; i++) 
    { 
     insparq.Groups[i] = data.groups[i]; 
     $.getJSON(participant_url, { /* data to send to server */ }, callback); 
    } 

} 

В этом фрагменте, функция обратного вызова выполняется каждый раз, когда вы получаете XMLHttpRequest от сервера. Последний выполняет PopulationGroups(), после обратного отсчета спускается до 1 из data.groups.length.