AJAX : problèmr d'asynchronisation !

cs_YASSINE1982 Messages postés 6 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 16 mars 2007 - 14 mars 2007 à 13:32
cs_YASSINE1982 Messages postés 6 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 16 mars 2007 - 16 mars 2007 à 19:48
J’ai essayé de modifier un tout petit peu laa fonction de malalam : http://www.phpcs.com/code.aspx?ID=32108 en fixant la
variable page en une constante ‘functions.php’  j’a déterminer la
méthode comme POST, mais j’ai ajouter un paramètre ‘MyFunction’. Le but
de ca c’est de pouvoir faire appel à une fonction PHP bien déterminée,
en déterminant la place où on veut afficher ses résultats.
Finalement
avec ça notre site va se composer de 3 fichiers : index.html ;
functions.php (qui contient tous les fonctions PHP) ; un fichier
script.js qui contient le actions script entre outre Ta fonction
SendData.
Ça marché très bien, mais par la suite j’ai essayé de
voir plus loin, c’est de développer une Fonction SendMultiData dont le
nombre de paramètres est indéterminé qui permet d’envoyer de 1 à
plusieurs requêtes au même temps et de recevoir les résultats et de les
placer successivement dans des différents places :
SendMultiData(param1,Place1,Function1, param2,Place2,Function2…)
Ce que j’ai fait c’est exécuter SendData Plusieurs fois avec des paramètres différents.
<script type="text/javascript">
/**
* Permet d'envoyer des données en GET ou POST en utilisant les XmlHttpRequest
*/
function sendData(param,place,myfunction)
{
myparam= param+'&myfunction='+myfunction;
page = 'function.php';
if(document.all)
{
//Internet Explorer
var XhrObj = new ActiveXObject("Microsoft.XMLHTTP") ;
}//fin if
else
{
    //Mozilla
var XhrObj = new XMLHttpRequest();
}//fin else

//définition de l'endroit d'affichage:
var content = document.getElementById(place);

XhrObj.open("POST", page);

//Ok pour la page cible
XhrObj.onreadystatechange = function()
{if (XhrObj.readyState 4 && XhrObj.status 200)
content.innerHTML = XhrObj.responseText ;
}

XhrObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
XhrObj.send(myparam);
param=null;
}//fin fonction SendData

function sendMultiData()
{

for (var i=0; i < sendMultiData.arguments.length; i=i+3)
{
para = sendMultiData.arguments[i] ;
placy = sendMultiData.arguments[i+1] ;
fction = sendMultiData.arguments[i+2] ;
sendData(para,placy,fction);
}
}

</script>  
Le
problème que ça par marché parce que, tout simplement,  JavaScript
continue l’exécution sans attendre la réponse du serveur qui sera
traitée quand elle arrivera, d’où le nom ‘Asychronous’
Quelqu’un peut trouver une solution ?
A
mon avis la boucle il faut que ca soit coté serveur comme ca le fichier
php s’execute une seule fois, il faut peut être envoyer un tableau de
données au serveur (param1,Place1,Function1, param2,Place2,Function2…)

Si vous pouvez m’aider  !

11 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
14 mars 2007 à 14:10
Salut,

j'avais essayé de faire ça, mais ça marchait pas top...

Ce que j'avais fait, une pile de requètes :
stack = Array();

SendMultiData aurait pour effet de pousser dans stack :
stack.push([param, place, func]); // là j'ajoute un autre tableau...

puis appelle une fonction de dépilage :
function unstack() {
    if ( stack.length ) {
        var elt = stack.pop();
        sendData(elt[0], elt[1], elt[2]);
    }
}

Et, dans la fonction qui est executée lorsque status == 'OK' (me souviens plus du code), tu rappelles unstack !!!

Par contre, je ne me souvient plus vraiment pourquoi ca plantait ... Un truc genre "certaines requètes plus rapides répondent avant d'autres... le bug!"

Essayes toujours!
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
14 mars 2007 à 20:03
>>>Un truc genre "certaines requètes plus rapides répondent avant d'autres... le bug!"

Il suffit d'ajouter un parametre indiquant à la fonction le temps minimum au bout duquel elle doit répondre. A la fin de la fonction, tu fait une boucle pour attendre que ce temps soit écoulé.

Flachy Joe
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
14 mars 2007 à 20:45
<< tu fait une boucle pour attendre que ce temps soit écoulé >>

Oui ... pas bête ... mais non!

Si je fais une boucle, je perds tout l'aspect "asynchrone" d'AJAX... Et ma boucle va bloquer javascript...

Par contre, avec les timers (je me souviens plus du nom de la fonction) là, c'est bon!!!

De toute façon, et entre nous, j'ai réglé le problème autrement : bazardé AJAX !
Chuis passé à OpenLaszlo
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
14 mars 2007 à 23:25
tu peux aussi assigner un id à ta requete et du coup tu peux recuperer l endroit ou stocker le resultat non??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_YASSINE1982 Messages postés 6 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 16 mars 2007
15 mars 2007 à 12:29
le problème avec timeout ou la boucle c'est que c'est pas une solution 100% logique, car on peut pas prévoir le temps que la reuquête vas prendre pour donner sa réponse.
>>> ça dépand de la connexion et d'autres facteurs, pour moi c'est pas une solution professionelle...

mais j'ai ponsser à autre chose c'est de développer une boucle coté serveur 'en PHP' qui exécute l'ensemble des fonction et envois les résultats des différents fonctions sous forme d'un tableau : [Place1,Résultat_Fonction1,Place1,Résultat_Fonction1...]

coté client une autre boucle en javascript place les résultats de la fonction1 dans la place1, de la fonction2 à la place2...

j'ai déjà commencer ce procesus, ça donne déjà des bonnes indices...

qu'est ce que vous pensez ?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
15 mars 2007 à 14:16
y a bon
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
15 mars 2007 à 19:54
Pour l'attente, c'était en PHP que je pensai la faire : le javascript ne bloque pas et le temps ne dépend pas de la connexion, uniquement du serveur. Mais bon si il y plus logique et professionel...

>>>tu peux aussi assigner un id à ta requete et du coup tu peux recuperer l endroit ou stocker le resultat non??
Tu pourait aussi envoyer l'endroit où stocker le resultat à la fonction PHP, qui te le renverrai avec ses autres résultats, comme ça pas d'histoire de tableau en JS et on a juste à traiter les resultats, pas les appels.

J'ai remarqué un truc aussi : avec FF tu faire plusieurs appel de Send à la suite avec le même objet XMLHttpRequest, par contre avec IE (6 tout du moins) ça marche pas et il faut refaire un nouvel objet pour chaque requete. J'imagine que refaire des objets à chaque fois, ça prend du temps et des ressources, donc si t'as plein de requetes à envoyer, ça peut être bien pour les FFiens d'utiliser un objet global.

Flachy Joe
0
cs_YASSINE1982 Messages postés 6 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 16 mars 2007
15 mars 2007 à 20:38
j'ai pas bien compris Flachy :
"Tu pourait aussi envoyer l'endroit où stocker le resultat à la fonction
PHP, qui te le renverrai avec ses autres résultats, comme ça pas
d'histoire de tableau en JS et on a juste à traiter les resultats, pas
les appels."
c claire je peut envoyé l'endroit à la fonction PHP et de le recevoir, mais quand il s'agit de plusieurs fonctions et chaque fonction à son endroit d'affichage, je croix qu'il faut absulement utiliser un tableau je Js pour faire le dispatching !

tu trouves pas ! ?
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
16 mars 2007 à 08:38
A chque fonction t'envoie le nom du div (par exmple) dans lequel afficher. Cette fonction te le renvoi en même temps que ses résultats. Avec ajax, tu chope le tout, tu retrouve le nom du div et tu y affiche le reste.
expl :
 send ("?function=machin&dans=div_bidule")
send("?function=machin2$dans=la_boite")

XhrObj.onreadystatechange = function()
{if (XhrObj.readyState 4 && XhrObj.status 200)
 //un morceau de parser XML pour séparer le nom du div et le resultat
 nom_du_div.innerHTML = resultat
}

Flachy Joe
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 mars 2007 à 09:43
Hello,

jette un oeil à une autre de mes classes : NOTIMEOUT. Ca devrait te donner quelques idées...j'ai comme l'impression que c'est pas loin de ce que tu veux faire.
Là, tu verras que j'utilise la solution que te préconise J_G : la pile de processus.
Il faut effectivement y ajouter un élément : une priorisation.
Par contre, Flachy Joe a raison : IE refusera de débuter plusieurs processus en même temps avec un seul objet xmlhttp.
0
cs_YASSINE1982 Messages postés 6 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 16 mars 2007
16 mars 2007 à 19:48
J’ai presque résolut le problème sauf que j’ai rencontré
deux petits problèmes du fait que je suis débutant en JavaScript.  


D’abord je vous explique :


Le principe de ma solution c’est d’envoyer une liste des
variables Post  à la page function.php :
Place1= ???&fonction1= ???&place2= ???&fonction2= ???


Dans la page PHP une boucle permet de créer un tableau JavaScript et
elle renvois :


MyTable = new array (place1,résultat_fct1, place2,
résultat_fct2…)


Le premier problème c que ce résultat je peux l’afficher
sous sa forme mais il n’est pas interprété comme chaine de caractère, la preuve
c que quand je veux récupérer le nombre des arguments il me renvois un un grand
nombre.  J_G tu a déjà converti un tableau
PHP en Tableau Js : http://www.codyx.org/snippet_transformer-tableau-tableau-javascript-meme-multi-dimensionnel_175.aspx


Mais comment tu a insérer $script_js  dans le code JavaScript.


Le deuxième problème c’est un problème PHP :


Dans la boucle que j’ai développé, qui exécute plusieurs fonctions
PHP (voir le fichier function.php)  je n’arrive
pas à exécuter  une fonction  déterminé par un nom variable :je qui
toujours obliger de tester touts les noms avec 
la condition.


Vous trouer sur ce lien : www.crea-soft.net/ajax.zip les
trois fichiers (index.php, script.js et 
function.php) ainsi que la base de données.


Merci d’avance !  
0
Rejoignez-nous