2009-06-08 5 views
0
variable = 0; 

function change() { 
variable = 1; 
} 

go = newVars(); 
go.onLoad = function(success) { 
trace("#First"); 
change(); 
} 
go.load('http://www.stackoverflow.com/variables'); 

trace("#Second"); 
trace(variable); // output = 0; 

Le problème est qu'il exécute #Second avant #First, ce qui signifie que l'objet ne soit pas chargé fullly mais le code continue néanmoins. Y at-il un moyen de gérer cela? J'ai essayé d'utiliser une boucle while, mais c'est moche et ça bloque le flash. Y a-t-il un moyen décent de gérer cela, est-ce dû à une meilleure structure de code/flux de programme ou existe-t-il un moyen technique de le faire attendre? Notez également: Ce code est exécuté côté serveur, ce qui signifie qu'il n'y a pas d'image impliquée. Lorsque les projets deviennent plus gros, cela devient très moche, en particulier lorsque vous récupérez des choses multiples à partir d'un serveur, vous devez utiliser une imbrication très profonde, vous devez continuer à répéter le même code, par exemple pour l'achat d'un numéro de série :LoadVars ne pas attendre jusqu'à ce que les données sont chargées

a.onload() { 


if(moneyAmount > 10){ 

    b.onload(pay) { 

    sendProduct(); 

    d.onload(serial) { 

    print(serial); 

    } 

    d.load('www.so.com/getSerial'); 

} 
    b.load('www.so.com/pay?amount=5'); 

}else{ 

    c.onload(wallet) { 

    displayWallet(wallet) 

    } 

    c.load('www.so.com/getWallet); 

} 

} 
a.load('www.so.com/checkMoneyAmount'); 

Répondre

1

Il ne devrait pas être nécessaire d'attendre, c'est la raison pour laquelle ils exposent l'événement 'onLoad'. Quel que soit le code que vous vouliez exécuter après qu'il soit complètement chargé, vous devriez mettre à l'intérieur de la fonction onLoad.

- modifier -

C'est juste la nature de la bête. Javascript n'est pas threadé, et vous ne savez pas quand vos appels de service Web vont revenir, vous devez donc utiliser un modèle asynchrone.

var bank = { 
    onGetSerial: function(s) { 
     print(serial); 
    }, 

    onPay: function(pay) { 
     sendProduct(); 
     d.load('www.so.com/getSerial'); 
    }, 

    onGetWallet: function(wallet) { 
     displayWallet(wallet); 
    }, 

    onCheckMoneyAmount: function(moneyAmount) { 
     if (moneyAmount > 10) { 
      b.load('www.so.com/pay?amount=5'); 
     } else { 
      c.load('www.so.com/getWallet'); 
     } 
    } 
}; 

a.onLoad = bank.onCheckMoneyAmount; 
b.onLoad = bank.onPay; 
c.onLoad = bank.onGetWallet; 
d.onLoad = bank.onGetSerial; 

a.load('www.so.com/checkMoneyAmount'); 
+0

J'ai ajouté un exemple dans ma question, quel genre de solution proposeriez-vous pour cela? –

+0

De cette façon, il vous suffit de configurer les gestionnaires onLoad une fois, et vous pouvez vous concentrer un peu plus sur la logique – AgileJon

Questions connexes