gestion de différents appels AJAX

gestion de différents appels AJAX - HTML/CSS - Programmation

Marsh Posté le 30-12-2007 à 01:04:41    

salut :) j'ai une p'tite question :)
 
par une p'tite fonction PHP j'ai généré une liste de fonctions JS a appeler utilisant AJAX.
Cette fonction créé à la volée un DIV dans un container commun dans tous les appels de fonctions.
Mais j'ai remarqué que parfois la réponse du troisieme appel de la fonction arrive avant la réponse des précédents et du coup mes DIV ne se créent pas dans le bon ordre.
 
Auriez-vous une solution pour ce genre de souci ?
 
Merci :) :hello:

Reply

Marsh Posté le 30-12-2007 à 01:04:41   

Reply

Marsh Posté le 30-12-2007 à 03:23:26    

Donc si j'ai bien compris, t'envoie trois requêtes et les réponses arrivent pas forcément dans le même ordre?
Tout à fait normal en tout cas.
Comme ça je dirais d'associer un id unique à chaque requête, qui sera ensuite inclus dans la réponse. Reste plus qu'à trier en fonction.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-12-2007 à 14:10:32    

C'est bien ca le probleme. Quand je recois l aréponse je créé un DIV.
Le probleme c'est que je peux pas le crééer avant d'avoir la réponse car je n'ai pas son id.
 
Je vois pas coment procéder !

Reply

Marsh Posté le 30-12-2007 à 15:50:08    

pour ton problème j'ai une petit idée mais un peu compliquée à mettre en oeuvre, il faudrait récupérer un champs time donné par le fichier php pour etre sur de l'ordre.
 
bonjour moi j'ai un autre problème qui tourne aussi autour de ajax, quans je fais une deuxieme requete internet explorer ne la recoit pas tandis que firefox si, voici mon code:
<?php include_once( "./common.php" );?>
 
<HTML>
<HEAD>
<TITLE>Titre de page</TITLE>
 
</HEAD>
 
<BODY onUnload="javascript:abort_xmlHttpRequest()">
 
<div id="discution" >
<div id="affiche_discution"></div>
 
</div>
<SCRIPT type="text/JavaScript">
<!--    
var page_receive = "<?php echo $PHORUM["http_path"]; ?>" + "/chat_receive.php";
var text = null;
 
 
function get_recent_message(){
 
 if (window.XMLHttpRequest) {
  xhr = new XMLHttpRequest();
 
  // Évite un bug du navigateur Safari :
  if (xhr.overrideMimeType) {
   xhr.overrideMimeType("text/xml" );
  }
 } else {
 
  if (window.ActiveXObject) {
   
   try { // essaie de charger l'objet pour IE
    xhr = new ActiveXObject("Msxml2.XMLHTTP" );
   } catch (e) {
    try { // essaie de charger l'objet pour une autre version IE
     xhr = new ActiveXObject("Microsoft.XMLHTTP" );
    } catch (e) {
     // message d'erreur
    } // try-catch
   } // try-catch
  }
   
 } // if-else
 
 xhr.onreadystatechange = function() {
  alert( xhr.readyState);
  if(xhr.readyState == 4){ ; //4 pour dire que le fichier est bien recu
   text = xhr.responseText;
   alert(text);
    var obj = document.getElementById("affiche_discution" );
    obj.innerHTML = obj.innerHTML + "<br>" + text;
    get_recent_message();    
  }
 }
//relance un requete sur le serveur  
 xhr.open("GET", page_receive+"?nocache="+Math.random(), true); //true pour asynchronous
 alert("next_request_launch" );
 xhr.send(null);
 
}
 
 
get_recent_message();
 
function abort_xmlHttpRequest(){
  xhr.abort();
}
 
//-->  // Fin de la partie cachée
</SCRIPT>
 
</BODY>
</HTML>
 
 
étant novice avec xmlhttprequest j'espère que mon erreur sera basique et facile à trouvée, merci

Reply

Marsh Posté le 31-12-2007 à 17:21:46    

if(xhr.readyState == 4){ ; //4 pour dire que le fichier est bien recu  
 
t'as pas un ';' en trop ? (moi je dis ca, mais j'en sais rien, c'est juste au cas où...)

Reply

Marsh Posté le 01-01-2008 à 15:20:39    

si c'est vrai y'a un point virgule en trop mais j'ai trouvé l'erreur plus importante: j'ai rajouté cela:
xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8" );
après xhr.open et je n'ai plus de problème (apparement c'était indispensable pour une bonne communication!)
 
merci

Reply

Marsh Posté le 02-01-2008 à 10:29:44    

Une solution serait aussi de compter les requetes AJAX "en-cours" dans une variable :
 
- Quand tu fais un nouvel appel AJAX, tu incrémentes la variable
- Quand tu reçois la réponse, tu décrémente la variable
 
Au moment où tu reçois ta réponse, tu stocke les informations qui t'intéressent dans une variable javascript, et tu appelles une fonction traiterResultat()
 
Dans la fonction, tu vérifies que tous les appels AJAX sont terminés (grâce à ta variable), et si c'est le cas, tu crées tes DIVs. Tu pourras alors trier tes infos dans l'ordre que tu veux :)

Reply

Marsh Posté le 02-01-2008 à 13:04:54    

Sur le principe je suis d'accord, mais je fais quoi si lorsque j'arrive dans ma fonction j'ai déjà une en attente ?
Faudrais faire une espece d'Event Observer ? J'ai pas la moindre idée de la facon dont gérer ca :/

Reply

Marsh Posté le 02-01-2008 à 15:01:56    

Ben j'ai une page où j'ai du faire ce que je décris au dessus.
 
En gros, la fonction agit comme ça :
 
- Si compteur = 0, je crée les DIVs et j'affiche le résultat
- Si compteur =/= 0, je fais rien
 
C'est pour ça qu'il est important de sauvegarder les résultats, puisque le traitement ne sera effectué qu'au dernier moment.
 
Si tu veux regarder ce que j'avais fait, la page en question est ici et le code Javascript .
 
La solution dont je parle est utilisée pour mettre à jour le total lorsque tu affiches l'inventaire d'un personnage. (pour tester, il faut un nom de personnage valide sur un serveur de World of Warcraft; par exemple "Naolia" sur le serveur "Kael'Thas" )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed