2011-03-25 2 views
0

je code comme ceci (je l'ai utilisé Dojo pour les classes):problème d'initialisation de l'objet - non nulle à l'intérieur de la fonction, mais est nulle quand je quitte la fonction

var current_div=null; 
var current_element=null; 
var elements_container=null; 
var status_container=null; 

function main(){ 
    //alert(status_container==null); 
    load_status_system(); 
    //alert(status_container==null); 
    load_ring_topology(); 
    //alert(status_container==null); 
} 

intérieur load_status_system je fixe la fonction load_status_system() {

dojo.xhrGet({ 
     url: "dynamic/status-system.json", 
     handleAs: "json", 
     load: function(obj) { 
      status_container=new STATUS_CONTAINER(obj); 
      alert(status_container==null); 
     }, 
     error: function(err) { 
      alert('error during loading status-system.json'); 
     } 
    }); 
} 

Le problème est que j'obtiens status_container null en dehors de la fonction mais à l'intérieur de la fonction elle n'est pas nulle. Quel est le problème avec ce code? Comment initialiser status_container pour ne pas être nul en dehors de la fonction?

+0

"_I get status_container null en dehors de la fonction _" ... quelle fonction? "_but à l'intérieur de la fonction, il est différent null _" ... différent null? Il n'y a pas de nulle différente ... pouvez-vous élaborer? "_Comment initialiser status_container ne pas être nul en dehors de la fonction", encore une fois, quelle fonction? – jordancpaul

Répondre

2

Votre portée semble être bonne. Je pense que vous vous battez contre la nature asynchrone des appels Ajax.

Comme affiché, l'ordre d'exécution de votre code est le suivant:

  1. fonction main
  2. main =>load_status_system()
  3. load_status_system =>dojo.xhrGet
  4. main =>load_ring_topology()
  5. La fonction main est terminée et sort (status_container est encore null)
  6. dojo.xhrGet reçoit sa réponse, appelle load()
  7. load => remplissages status_container
  8. load alerte les nouvelles status_container et sorties.
  9. votre code est en cours d'exécution fait

La solution à votre problème serait de dire xhrGet faire son appel synchrone. Je n'ai jamais utilisé Dojo, donc je ne sais pas comment faire ça. Habituellement, cela est fait en définissant la propriété async de l'objet XHR à .

+0

Maintenant que je comprends le problème, je suis entièrement d'accord avec cela. Fondamentalement, si 'load_ring_topology()' ne peut être appelé qu'après le retour de 'dojo.xhrGet', vous devez le mettre dans un rappel. +1 – jordancpaul

+0

Une chose, cependant, je voudrais mettre en garde l'utilisation des requêtes xhr synchrones. Il y a une raison pour laquelle de nombreuses librairies javascript n'exposent pas cette option car elle conduit à des applications javascript lentes/ne répondant pas lorsqu'elles sont utilisées fréquemment – jordancpaul

+0

Assez vrai. La meilleure solution est de mettre load_ring_topology dans la fonction de rappel load. – Martijn

1

Il s'agit probablement d'un problème de portée. J'essaierais d'accéder à status_container en tant que window.status_container depuis le rappel XHR

0

Utilisez dojo.hitch() pour spécifier l'étendue dans laquelle la fonction sera exécutée.

Questions connexes