2010-12-13 5 views
0

J'ai un objet JSON qui est rempli par un XHR. J'ai alors besoin de mettre à jour cet objet avec les valeurs d'un appel XHR séparé. Le problème que je rencontre est le deuxième appel n'est pas fait au bon moment et je pense que c'est un problème avec la façon dont j'ai structuré mon objet. Voici ce que j'ai:Objet JSON XHR et fermetures

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

Je pense que nommer une variable appelée 'proprietary' dans une fonction appelée' proprietary' pourrait causer des problèmes, n'est-ce pas? –

+1

'PopulateGroups' est appelé AVANT tous les' $ .getJSON (participant_url ... '.Vous devez vérifier le nombre de participations que vous chargez en utilisant un compteur externe et en vérifiant la taille de' proprietary.Groups' dans le '$ .getJSON (participant_url ...' fonction de rappel et seulement quand ils sont égaux vous devriez appeler 'PopulateGroups. ' –

+0

Merci, Horia Où/comment serait incrémenter le compteur? –

Répondre

1

Il semble y avoir un certain nombre de choses étranges dans cet extrait de code. Tout d'abord, $ .getJSON (...) prend un troisième paramètre, qui est votre callback. Le deuxième paramètre est les données. Je pense que vous passez une fonction en tant que votre paramètre de données. Vous devrez corriger cela aux deux endroits. Si vous n'avez pas besoin de passer quelque chose, ayez simplement votre second paramètre comme objet vide {}.

Voici une façon générale d'exécuter un rappel après que TOUTES vos requêtes XMLHttpRequests sont revenues du serveur.

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); 
    } 

} 

Dans cet extrait, la fonction de rappel est exécutée chaque fois que vous obtenez un XMLHttpRequest à partir du serveur. Le dernier exécute PopulateGroups(), après que le compte à rebours descend à 1 à partir de data.groups.length.