Forum de discussion
Forum « Flash et Shockwave » (archives)
Re: double chargement d'XML [Pb temps de chargement]
Envoyé: 3 décembre 2005, 3h50 par toph
alors, je n'ai pas trop regardé ton code en détail mais le deuxième mail que tu envois me rappelle un problème avec lequel j'ai bien galéré aussi...
en fait, si j'ai bien tout suivi, tu as besoin d'avoir chargé ton premier xml pour lancer le chargement du deuxième, c ça?
et bien, c'est là qu'est tout le problème.
En actionscript, ce n'est pas parce que des lignes de codes sont écrites avant, qu'elles sont forcément terminées au moment ou la tête de lecture passe à la suivante. Ce détail est particulièrement vrai dans le cas des fonctions onLoad.
Un petit exemple pour être plus clair
Prenons le code suivant:
monXML.load(infoXML);
monXML.onLoad = function(...) {
___code divers;
___infoXML2 = quelquechose;
___autres lignes de code...;
}
monXML2.load(infoXML2);
monXML2.onLoad = function (...) {
___[...]
}
suite du code1;
suite du code2;
suite du code3;
...
Ce code simplifié ressemble dans la structure au tien ...
Comment le flash va-t-il lire ce fragment? Le résultat sera le même que s'il avait empilér les appels de fonctions et qu'il les avait exécuté toutes ensuite ...
Biensûr ce n'est pas comme ça que flash fonctionne, mais dans le cas présent le résultat est identique.
En fait, quand flash va lire ton monXML.load, il va mettre en place la connexion (pour atteindre infoXML qui est le chemin du fichier source). Cette opération prend un certain temps, même infime mais suivant pour que flash se dise :
"ok, j'ai demandé la connexion, mais je n'ai pas encore eu de retour. En atetndant je vais passer aux lignes suivantes."
Il lit donc les lignes qui suivent.
Tu vas me demander : mais le .onLoad, il sert à quoi? excellente question. Le onLoad est exécuté quand la connexion avec le fichier source est faite et que flash a chargé son contenu [ou au moins une partie] ... Entre temps, flash a continué sa lecture du code général en empilant les appels load (et donc les réponses onLoad), mais malheureusement sans avoir initialisé infosXML2.
Donc pour simplifier : à cause de ce temps de connexion minimal ton flash va lire les choses dans cette ordre :
- monXML.load(infoXML); infoXML est bien initialisé;
- monXML2.load(infoXML2); infoXML n'est pas encore initialisé.
- suite du code1;
- suite du code2;
- suite du code3;
- monXML2.onLoad() qui retourne une erreur puisque infoXML2 vaut 'undefined'
- monXML.onLoad() qui va logiquement démarré après puisque la connexion va prendre un peu de temps à se mettre en place (en tout cas, plus longtemps que le retour d'erreur de monXML2.onLoad, d'où le fait qu'elle se lance après)
- et dans mon XML.onLoad :
- - code divers;
- - infoXML2 = quelquechose; c maintenant que infoXML2 est initialisé, mais trop tard!
- - autres lignes de code...;
voilà, j'espère que j'ai été clair. j'en ai chier avec ça. Surtout quand tu dois retraiter les fichiers derrière et que t'en as 50000 à la suite... bref c'est une misère ... mais ça semble logique, non?
pour résoudre ton problème (si tant est que ce soit celui-là) il faudrait faire :
monXML.load(infoXML);
monXML.onLoad = function(...) {
___code divers;
___infoXML2 = quelquechose;
___monXML2.load(infoXML2);
}
monXML2.onLoad = function (...) {
___[...]
___suite du code1;
___suite du code2;
___suite du code3;
}
Comme ça tu es sûr que ton monXML2.load() ne sera lancer que au moment ou infoXML2 sera initialisé et pas avant!!!
Voilà, voilà, j'espère que ça ira...
A plus
Toph'
Réponses
|