JSON Object XHR и замыкания - PullRequest
       1

JSON Object XHR и замыкания

0 голосов
/ 13 декабря 2010

У меня есть объект JSON, который заполняется XHR.Затем мне нужно обновить этот объект значениями из отдельного вызова 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();
  }

};

1 Ответ

1 голос
/ 11 января 2011

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

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

Вот один из основных способов выполнения обратного вызова после того, как ВСЕ ваши XMLHttpRequest возвращаются с сервера.

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 с сервера. Последний выполняет PopulateGroups () после обратного отсчета до 1 из data.groups.length.

...