2012-07-18 3 views
1

Je voudrais appeler une fonction dans une fonction et faire en sorte que cette fonction interne renvoie un objet. J'utilise une fonction JSONRequest que j'ai créée moi-même, donc supposons que la requête récupère un tableau de rôles. Voici le code:Fonction JavaScript dans une fonction - renvoi d'un objet

(users = function(){ 

    this.getUserRoles = function(){ 

     var params = {}; 

     var json = new JSONRequest(function(data){ 

      rolesObj = data['roles']; 

      return rolesObj; 

     }, 'get_roles', params); 

    } 

}); 

Alors j'appelle les suivants, mais il undefined:

var cls = new users(); 

alert(cls.getUserRoles().length); 

Répondre

2

Les requêtes ajax sont asynchrones, donc vous n'obtiendrez pas de valeur de retour de leur part. Cependant, vous recevez un rappel quand ils se terminent afin que vous puissiez passer votre valeur "retour" dans un rappel.

Voici un exemple de votre Réécrit code pour utiliser un rappel:

this.getUserRoles = function(completionCallback){ 

    var params = {}; 

    var json = new JSONRequest(function(data){ 

     rolesObj = data['roles']; 

     completionCallback(rolesObj); 
     return rolesObj; 

    }, 'get_roles', params); 

} 

puis l'utiliser:

var cls = new users(); 
cls.getUserRoles(function(roles) { 
    alert(roles.length); 
}); 

Le rolesObj est passé dans la fonction de rappel une fois que la demande JSON complète.

+0

merci! travaillé comme un charme et maintenant je peux personnaliser ce qu'il faut faire avec les données en ayant des fonctions de rappel uniques. impressionnant. – Freddie

1

Votre fonction getUserRoles ne retourne rien. Il appelle une requête JSON asynchrone et le rappel de succès pour cette requête renvoie quelque chose.

Il n'existe aucun moyen d'effectuer une requête asynchrone dans une fonction et de renvoyer de manière synchrone la valeur de la requête. La demande prendra une quantité de temps inconnue et la fonction de demande retournera dès que la demande aura été envoyée. La valeur ne sera pas encore revenue du serveur.

+0

hmm ... alors quelle est la meilleure façon de rendre certaines fonctions répétables modulaires? Par exemple, je dois obtenir une liste de rôles sur différents aspects de mon application Web et l'utiliser de différentes manières. Je pourrais vouloir obtenir une liste de rôles et le mettre dans une boîte de choix, ou obtenir cette liste et le mettre dans un div ... – Freddie

Questions connexes