[AJAX] Casse-tête asynchrone
Résolu
gnomesgames
Messages postés
84
Date d'inscription
Statut
Membre
Dernière intervention
-
rico568@hotmail.com Messages postés 1 Date d'inscription Statut Membre Dernière intervention -
rico568@hotmail.com Messages postés 1 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voila , je voudrait réussir a charger des élément depuis ma base de donnée , en passant par du javascript et des HttpRequest.
Pour l'instant , j'ai réussi a faire cela , mais tout les élément sont chargé en même temps , je m'explique :
J'ai trois fonction :
-Une fonction 'globale' qui orchestre la boucle principale en fonction des paramètres entrés
-Une fonction qui se charge de lancer le chargement en asynchrone pour un élément donné
-Une fonction qui traite les donnée d'un élément quand le chargement de cet élément est finit
Mon problème :
J'utilise dans la fonction 'principale' une boucle for , mais apparement , celle ci n'attend pas que les donnée de la case précédente soit traité pour continuer , j'ai donc 81 HttpRequest qui se lance en même temps ,et ca fait planter 1 fois sur 2 mon navigateur web (on le comprend)
Donc : Comment je pourrais faire pour que la boucle principale attende que les données soit arrivées et traité avant de continuer , sachant que je ne veut pas bloquer le navigateur du visiteur ?
Merci d'avance
PS : Si vous avez besoin du code dites le moi ...
Voila , je voudrait réussir a charger des élément depuis ma base de donnée , en passant par du javascript et des HttpRequest.
Pour l'instant , j'ai réussi a faire cela , mais tout les élément sont chargé en même temps , je m'explique :
J'ai trois fonction :
-Une fonction 'globale' qui orchestre la boucle principale en fonction des paramètres entrés
-Une fonction qui se charge de lancer le chargement en asynchrone pour un élément donné
-Une fonction qui traite les donnée d'un élément quand le chargement de cet élément est finit
Mon problème :
J'utilise dans la fonction 'principale' une boucle for , mais apparement , celle ci n'attend pas que les donnée de la case précédente soit traité pour continuer , j'ai donc 81 HttpRequest qui se lance en même temps ,et ca fait planter 1 fois sur 2 mon navigateur web (on le comprend)
Donc : Comment je pourrais faire pour que la boucle principale attende que les données soit arrivées et traité avant de continuer , sachant que je ne veut pas bloquer le navigateur du visiteur ?
Merci d'avance
PS : Si vous avez besoin du code dites le moi ...
A voir également:
- [AJAX] Casse-tête asynchrone
- L'en-tête du document comporte une information qui n’apparaît pas à l'impression car elle est de couleur blanche. de quelle information s'agit-il ? ✓ - Forum Bureautique
- Réparation écran tv samsung cassé ✓ - Forum Téléviseurs
- Yggtorrent erreur ajax ✓ - Forum Webmastering
- Écran ordinateur cassé sans choc - Forum Ecran
- Écran pc portable cassé mettre second écran en écran primaire ✓ - Forum PC portable
5 réponses
C'est sur qu'avec le code on comprendrait mieux.
Mais si tu veux synchroniser, utilises une variable "compteur"
premier envoi HttRequest $cpt=1 tu envoie ce nombre au script "distant" qui l'incrémente de 1 et te le retourne avec le résultat
et tu utilises ce nouveau chiffre pour envoyer la requette suivante
etc...
Mais si tu veux synchroniser, utilises une variable "compteur"
premier envoi HttRequest $cpt=1 tu envoie ce nombre au script "distant" qui l'incrémente de 1 et te le retourne avec le résultat
et tu utilises ce nouveau chiffre pour envoyer la requette suivante
etc...
Bon voilà j'ai fini , c'est pas mal , et j'utilise pas mal de ton code source ;) !
Merci encore pour ton aide !!!
Merci encore pour ton aide !!!
oui moi je veux bien ton code, peut-être il pourrait m'aider, j'ai un problème en firefox avec les requetes http, on dirai qu'il n'accepte qu'une seule instance à la fois.
j'ai plusieurs listes déroulantes avec des sous-catégories, si j'appelle une deuxième fois ma fonction makeRequest(), je n'obtiens rien avec firefox.
merci
Rico
j'ai plusieurs listes déroulantes avec des sous-catégories, si j'appelle une deuxième fois ma fonction makeRequest(), je n'obtiens rien avec firefox.
merci
Rico
Hum... Mon code a beaucoup évolué depuis, il ne ressemble plus trop a ça , même si je fait toujours des requêtes HTTP.
Voila la partie de code javascript qui se charge des requêtes a mes pages php, elle marche très bien sur firefox et IE, et je pouvais la lancer plusieurs fois d'affiler sans problème (même si je ne la lance plus qu'une fois maintenant, la page php renvoyant toutes les informations d'un coup.) :
Powered by : The Wall Et Gain Brothers
Voila la partie de code javascript qui se charge des requêtes a mes pages php, elle marche très bien sur firefox et IE, et je pouvais la lancer plusieurs fois d'affiler sans problème (même si je ne la lance plus qu'une fois maintenant, la page php renvoyant toutes les informations d'un coup.) :
//Rempli les différentes cases function map(debx,deby,finx,finy,affx,affy) { //On crée une variable pour receuillir le résultat var xhr=null; //On crée les HttpRequest if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //On défini ce que le navigateur doit faire la fin de la requete (lance maj_case avec les parametres donné quand la requete est terminée) xhr.onreadystatechange = function() { maj_case(xhr,debx,deby,finx,finy,affx,affy,affy); }; //On configure la requete xhr.open("GET", "rep_map.php?debx="+debx+"&deby="+deby+"&finx="+finx+"&finy="+finy, true); //Et on la lance xhr.send(null); }
Powered by : The Wall Et Gain Brothers
Je ne sais pas si ça a un rapport avec toi mais moi j'avais aussi ce problème que je voulais qu'ajax attende la fin de la requête avant de poursuivre. Ma solution a été de changer:
xmlHttp.open("GET",URL,true);
pour
xmlHttp.open("GET",URL,false);
Le false signifiant que je veux que la requête soit synchrone et le true voulant dire le contraire. Vlà je sais pas si c'était ça ton problème aussi mais je crois que ça y ressemblait peut-être. Vive les noobs du Ajax ^_^
xmlHttp.open("GET",URL,true);
pour
xmlHttp.open("GET",URL,false);
Le false signifiant que je veux que la requête soit synchrone et le true voulant dire le contraire. Vlà je sais pas si c'était ça ton problème aussi mais je crois que ça y ressemblait peut-être. Vive les noobs du Ajax ^_^
Je sais pas , j'ai réussi avec tout faire sans changer ce paramètre moi ^^'...
Je crois que cette ligne :
Signifie qu'il ne lance la requête que quand xhr change d'état, il suffit de mettre un test dans la fonction ciblée pour vérifié que la requête est bien finie...
Après c'est vrai que je débute en Javascript et AJAX, je le fait plus au feeling donc ^^' ...
Je crois que cette ligne :
xhr.onreadystatechange = function() { maj_case(xhr,debx,deby,finx,finy,affx,affy,affy); };
Signifie qu'il ne lance la requête que quand xhr change d'état, il suffit de mettre un test dans la fonction ciblée pour vérifié que la requête est bien finie...
Après c'est vrai que je débute en Javascript et AJAX, je le fait plus au feeling donc ^^' ...
Ok et bien il doit y avoir plusieurs façon de faire mais moi en cherchant j'ai trouvé que ce paramètre touchait justement le synchrone/asynchrone de la requête et je me suis dis que c'était plus facile que changer un tas d'autres trucs. Donc j'ai commencé par là.
Bref, de toute façon, j'ai encore des trucs à apprendre alors je n'irais pas dire que j'ai plus raison que toi. Il risque qu'un jour je doive faire comme toi, qui sait. ^^
Bref, de toute façon, j'ai encore des trucs à apprendre alors je n'irais pas dire que j'ai plus raison que toi. Il risque qu'un jour je doive faire comme toi, qui sait. ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
En effet l'http request ne voulait pas fonctionner en firefox.
Mon problème se situait ailleurs en fait, firefox ne fonctionnait pas bien en httpRequest car mon formulaire était imbriqué dans une table entre la balise <table> et <tr> (afin d'éviter les espaces qui se crée à cause d'une balise form)
Et bien cela empêche apparement à firefox de reconnaitre les éléments par id.
Tout va bien maintenant.
merci
Rico
Mon problème se situait ailleurs en fait, firefox ne fonctionnait pas bien en httpRequest car mon formulaire était imbriqué dans une table entre la balise <table> et <tr> (afin d'éviter les espaces qui se crée à cause d'une balise form)
Et bien cela empêche apparement à firefox de reconnaitre les éléments par id.
Tout va bien maintenant.
merci
Rico
Le problème c'est pour faire 'patienter' Javascript , qui m'a l'air d'être un langage qui ne sait pas attendre sans tout bloquer ;) !
Voila donc mon code , j'ai essayé de commenter mais je sait pas trop si le résultat est probant :
La fonction générale que j'appelle , avec pour argument , les coordonnée x,y de n'importe quelle case de mon 'monde'.
Dans cette fonction c'est la boucle 'for' qui me préoccupe , car apparemment , c'est elle qui refuse d'attendre la fin de sont contenu pour continuer..
La fonction qui lance les requêtes :
Celle ci n'a rien de particulier , elle lance une requête en définissant ce que JS doit faire a la fin.
Et pour finir de bien charger le message , la fonction de gestion de la réponse du serveur :D !
Pour la partie Php , le serveur renvoi un XML avec juste :
<map>
</map>
si la case est vide sinon , quelque chose comme :
<map>
<donnee>Hello</donnee>
</map>
Et voilà , si ça peut vous aider à résoudre mon problème ... Si vous voyez des amélioration à faire dans mon code (et je suis sur que il y en a un paquet ...) n'hésitez pas !
dans la fonction qui traite la réponse rajoutes ces tests:
Sinon moi j'avais fait un truc comme ça:
C'est dans la fonction qui traite la réponse que l'on rappelle à nouveau la fct httpRequest tant que la limite du compteur n'est pas atteinte.
Pour le lancement de la fonction de HttpRequest depuis la fonction de traitement , j'ai déjà essayé mais je n'ai jamais réussi .
Sinon , le seul problème qu'il reste c'est que quand l'utilisateur clique plusieurs fois de suite sur les flèches (sans attendre la fin du chargement) , le script lance plusieurs fois de suite la fonction de chargement , et donc çà rame et je me retrouve avec une carte ou tout les bâtiment des différents territoire dessus.
Ma question :
Comment arrêter l'exécution des fonction quand on clique sur une flèche ??
J'ai modifié le script , maintenant , x et y sont des variables globales , déclaré comme ceci :
La fonction loadmap fait donc maintenant ceci :
Voila , je ne sait pas pourquoi ma tentative de détection échoue :S ...
Merci d'avance