Bonjour,
Explication rapide du problème :
J'ai fait une petite application de drag and drop sur des objets SVG. Et je voudrais pouvoir enregistrer les modifications suite au drag and drop. Le fichier que je dois enregistrer est donc un .svg .
Pour cela j'ai fait plusieurs requetes XMLHttpRequest qui appellent des scripts PHP de facon asynchrone. Jusque là tout va bien ça marche. Le problème est que je fais consécutivement une centaine de requetes XHR (donc execution de script php), et pour je ne sais quelle raison certains scripts (A) se finissent avant d'autres (B), alors que les scripts B ont été lancé avant les scripts A.
Pour etre un peu plus clair je vais vous montrer un extrait de mon fichier lancant les XHR.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
function SaveMap()
{
        alert("Save in progress ...");
        //Ecriture du header du fichier SVG
	var transport = getXMLHttpRequest();
	var adresse_init = ["init_map.php"];
        //astuce bidon pour eviter que certain objets soient ecrits avant d'autres
	svg_recwall.sort();
	svg_text.sort();
	transport.open("get", adresse_init.join(""), true);
	transport.send(null);
	//writeWall appel un traitement PHP qui ecrit dans le fic SVG
	for(var i in svg_recwall)
	{
		window.setTimeout("writeWall(" + i + ", 'W' )", 1000);
	}
	pausecomp(700);
	for(var i in svg_recdrop)
	{
		window.setTimeout("writeWall(" + i + ", 'D' )", 50);
	}
	pausecomp(1000);
	//writeCell appel un traitement PHP qui ecrit dans le fic SVG
	for(var i in svg_recgem)
	{
		window.setTimeout("writeCell(" + i + ")", 50);
	}
	pausecomp(1000);
	//writePath appel un traitement PHP qui ecrit dans le fic SVG
	for(var i in svg_recpath)
	{
		window.setTimeout("writePath(" + i + ")", 1000);
	}
	pausecomp(1000);
	//writeText appel un traitement PHP qui ecrit dans le fic ...
	for(var i in svg_text)
	{
		window.setTimeout("writeText(" + i + ")", 1000);
		if( i == (svg_text.length - 1))
		{
                        //dernier traitement pour finaliser le fichier svg (fermeture balises)
			finishing_save();
		}
	}
	alert("Save done !");
}
Donc comme vous l'avez compris les fonctions writeXXX() sont des fonctions qui récupèrent les objets et les attributs voulus pour les réécrire dans le fichier SVG à l'aide d'un traitement PHP. Mais ici le temps de traitement PHP n'est pas le même dans tous les scripts .... donc certains passent avant d'autres alors qu'algorithmiquement parlant ils sont derrière.
La fonction pausecomp() est simplement un compteur sensé retarder l'execution de la fonction (oui je sais c'est pas joli du tout!!).
Au final avec ce système D j'arrive à faire en sorte que le fichiers SVG soit bien réécrit mais le problème reste dans le dernier traitement (finishing_save()) qui lui est extrèmement court (il écrit simplement "</g></svg>" dans le fichier) et qui s'execute beaucoup trop tôt : juste après la première requete XHR d'initialisation....
J'ai tenté par tous les moyens de faire attendre l'interpréteur mais ça ne marche pas.
Au final j'ai pensé à faire une requete synchrone mais le pb c'est qu'il n'y aura aucune réponse du serveur ... donc rien à attendre ...
Quelqu'un aurait-il une idée svp??? parce que là je commence à désespérer.
Merci