Tableau d'objets XmlHttpRequest

Tableau d'objets XmlHttpRequest - HTML/CSS - Programmation

Marsh Posté le 04-08-2010 à 09:58:34    

Bonjour,
 
Après recherche, je n'ai point trouvé de réponse à ce sujet.
 
Je cherche à faire un JavaScript qui doit effectuer plusieurs requêtes à l'aide de l'objet XmlHttpRequest afin d'aller chercher diverses informations dans plusieurs fichiers. Plusieurs requêtes ont donc lieu grâce à une boucle, mais seule la dernière fonctionne ; les précédentes bloquent au statut chargement (.status = 1). Comme toutes les requêtes successives étaient associées à la même variable ( xhr = new XmlHttpRequest(); ), je suppose que les appels successifs écrasaient les précédentes requêtes.
 
J'aimerais donc différencier les requêtes afin qu'elles puissent aller à leur terme en les mettant dans un tableau d'objets. J'espérais obtenir quelque chose de ce genre :
 
xhr[0] = new XmlHttpRequest();
xhr[1] = new XmlHttpRequest();
xhr[2] = new XmlHttpRequest();
...
 
En théorie, on peut créer des tableaux d'objets en JavaScript. Malheureusement, cela ne fonctionne absolument pas.
 
Voilà l'essentiel de la démarche :
 
Je crée un tableau :
 
var xhr = new array(10);     (pour une dizaine de requêtes)
 
 
Dans la boucle, j'initialise d'abord à false, puis j'affecte l'objet :
 
xhr[x] = false;
xhr[x] = new XmlHttpRequest();
if(xhr[x])
{
  xhr[x].onreadystatechange = appel de fonction;
  xhr[x].open("GET", url, true);
  xhr[x].send(null);
}
 
Dans la fonction, je récupère évidemment de la façon suivante :
 
document.getElementById("balise" ).innerHTML = xhr[x].responseText;
 
 
Comme je le disais, ça ne fonctionne pas. Pourquoi ? Et quelle solution conviendrait pour gérer plusieurs requêtes ?
 
Merci pour votre attention :)

Reply

Marsh Posté le 04-08-2010 à 09:58:34   

Reply

Marsh Posté le 04-08-2010 à 17:59:57    

Hmm, dans ton callback tu as bien fait une closure sur la variable x ? Parce que sinon ton xhr[x] va te renvoyer null. Bref je ferais un truc du genre :
 

Code :
  1. for (var x = 0; x < 10; x ++)
  2. {
  3.    var request = new XMLHttpRequest();
  4.  
  5.    request.onreadystatechange = function() {
  6.        ma_fonction(request)
  7.        if (request.readyState == 4) delete request.onreadystatechange
  8.    }
  9.    request.open("GET", url, true)
  10.    request.send(null)
  11. }
  12.  
  13. function ma_fonction(request)
  14. {
  15.     if (request.readyState == 4)
  16.     {
  17.          document.getElementById("balise" ).innerHTML = request.responseText;
  18.     }
  19. }


Reply

Marsh Posté le 05-08-2010 à 06:03:14    

Je ne saisis pas ce que tu appelles "closure" sur la variable x. J'ai jeté un œil sur un tuto là-dessus, mais là, de but en blanc, c'est un peu chaud ^^ Il faudrait que je vois ça à tête reposée...
 
D'un autre côté, je ne fais pas de "delete request...", mais je doute que le problème vienne de là.
 
J'ai continué mes recherches aux sujet des requêtes multiples et il semblerait que ce soit difficile voire impossible à gérer correctement. Pour bien faire, il faudrait que les requêtes soient synchrones. Le script devrait s'arrêter et attendre sagement que la requête se termine avant de continuer sur les instructions suivantes et d'aborder la requête suivante. A priori, le troisième paramètre de la méthode à false (open("GET", url, false)) devrait permettre cela, mais il semblerait que cette option soit mal implémentée, sinon pas implémentée du tout.
 
D'autre part, il faudrait gérer des résultats de requêtes susceptibles de revenir dans n'importe quel ordre. Ce qui suppose, dans la fonction de traitement de la réponse, d'être capable de reconnaître le résultat que l'on récupère pour le traiter correctement.
 
Je vais tout de même essayer ta solution, au cas où.


Message édité par madraf_tint le 05-08-2010 à 06:03:52
Reply

Marsh Posté le 10-08-2010 à 23:45:29    

Pour ceux que ça intéresserait, j'ai finalement opté pour une solution qui ne requiert qu'une seule requête. Je ne savais pas qu'il était possible d'opérer une requête JavaScript sur un script PHP.
 
Du coup, tout devient simple : le JavaScript envoie la valeur du cookie vers le PHP qui peut ainsi reconnaître l'utilisateur connecté. À partir de là, il est facile de préparer toutes les données nécessaires à renvoyer de façon personnalisée sans se prendre le chou avec un paquet de requêtes JavaScript ingérables.
 
Merci tout de même pour ton aide :)

Reply

Sujets relatifs:

Leave a Replay

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