Ajax en asychrone

Ajax en asychrone - HTML/CSS - Programmation

Marsh Posté le 22-10-2006 à 22:53:57    

Ajax gèle le navigateur parce qu'il est utiliser en asynchrone. Comment faire pour que la fonction stoppe après un délai? Parce que si la requête gèle le navigateur pendant plus de 5 secondes, c'est vraiment trop long.
 

Code :
  1. function file(fichier)
  2.      {
  3.      if(window.XMLHttpRequest) xhr_object = new XMLHttpRequest();
  4.      else if(window.ActiveXObject) xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  5.      else return(false);
  6.      xhr_object.open("GET", fichier, false);
  7.      xhr_object.send(null); 
  8.      if(xhr_object.readyState == 4) return(xhr_object.responseText);
  9.      else return(false);
  10.      }

Reply

Marsh Posté le 22-10-2006 à 22:53:57   

Reply

Marsh Posté le 23-10-2006 à 21:01:12    

tu pourrais pas utilise un timeout?


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 23-10-2006 à 22:32:09    

Salut,
Essaie  

Code :
  1. var xhr_object = null;
  2. function file(fichier){
  3.   ...
  4.   ...
  5.   xhr_object.onreadystatechange = masuperfonction;
  6.   xhr_object.open("GET", fichier, false);
  7.   xhr_object.send(null);
  8. }
  9. function masuperfonction(){
  10.   if(xhr_object.readyState == 4 && xhr_object.status == 200){
  11.   //fais ce que tu veux ici avec xhr_object.responseText
  12.  
  13. }

Reply

Marsh Posté le 24-10-2006 à 01:51:49    

kirua_sama : Où ?
 
sigmar_ : Rien de neuf, si ce n'est que la vérification du code de la réponse du serveur.

Reply

Marsh Posté le 24-10-2006 à 07:58:24    

si ca bloque le navigateur, tu es en mode synchrone
 
remplace xhr_object.open("GET", fichier, false);
par  
xhr_object.open("GET", fichier, true);
 

Reply

Marsh Posté le 24-10-2006 à 08:34:25    

My bad, j'avais copié/collé ton code.
Comme dit flo850 sinon.
Note que mon "si ce n'est" est utile.

Reply

Marsh Posté le 25-10-2006 à 18:05:58    

Ça ne me dérange pas que le navigateur gèle pendant un instant, je veux juste qu'il ne gèle pas plus de 5 secondes. Et je ne peux pas me mettre en asychrone (pardonner moi l'erreur dans le titre), parce que la variable est reprit dans un script, le script étant en attente d'une réponse pour finaliser son action. Ce que je veux en fait, c'est afficher un message d'erreur après le délai de 5 secondes de gel dépasser.
 
Merci de m'aider.

Reply

Marsh Posté le 25-10-2006 à 20:10:30    

tu fais ta requete en asynchrone
 
puis  ,tu fait une boucle:
 
boucle : Si la reponse est prete ?  
                 alors traitement de la reponse
                 sinon est ce que j'ai deja attendu 5s ?  
                           alors message d'erreur :/  
                           non alors attendre 1s et on repart pour un tour de boucle

Reply

Marsh Posté le 26-10-2006 à 11:19:35    

flo850 a écrit :

tu fais ta requete en asynchrone
 
puis  ,tu fait une boucle:
 


 
Pas sur que ca réponde a sa demande : Le sleep n'existe pas en javascript à ma connaissance donc pour le faire il faut encore un timer. Le problème d'utilisation séquentielle de la variable reste par conséquent posé non puisqu'on reste dans un fonctionnement événementiel ?  
 
Pour ma part j'ai choisi de faire de l'asynchrone en "bloquant" graphiquement l'interaction sur la page mais l'exploitation du résultat de la commande AJAX se fait dans un handler.
 
Je suis preneur d'une solution "séquentielle" si quelqu'un a mais je ne vois pas comment ...
 
 
 

Reply

Marsh Posté le 26-10-2006 à 14:53:45    

Il va falloir que tu me montre ça flo850, une boucle avec pause dans une seule fonction conservant les returns pour la valeur retournée.   :sweat:

Reply

Marsh Posté le 26-10-2006 à 14:53:45   

Reply

Marsh Posté le 06-11-2006 à 14:09:12    

Dans :

Code :
  1. var k=0;
  2. function file(fichier)
  3. {
  4. if(window.XMLHttpRequest) xhr_object = new XMLHttpRequest();
  5. else if(window.ActiveXObject) xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  6. else return(false);
  7. xhr_object.open("GET", fichier, true);
  8. xhr_object.send(null);
  9. k=0;var timer = setInterval("if(xhr_object.readyState==4 && xhr_object.status==200){document.title=k;alert(xhr_object.responseText);clearInterval(timer)};else{k++;document.title=k};",1);
  10. }

Je ne peux même pas remplacer le "alert" par un "return" parce qu'il est trop tard.
Que faire?  :(

Reply

Marsh Posté le 06-11-2006 à 14:53:01    

darkkrab a écrit :

Dans :

Code :
  1. var k=0;
  2. function file(fichier)
  3. {
  4. if(window.XMLHttpRequest) xhr_object = new XMLHttpRequest();
  5. else if(window.ActiveXObject) xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  6. else return(false);
  7. xhr_object.open("GET", fichier, true);
  8. xhr_object.send(null);
  9. k=0;var timer = setInterval("if(xhr_object.readyState==4 && xhr_object.status==200){document.title=k;alert(xhr_object.responseText);clearInterval(timer)};else{k++;document.title=k};",1);
  10. }

Je ne peux même pas remplacer le "alert" par un "return" parce qu'il est trop tard.
Que faire?  :(


Reply

Marsh Posté le 06-11-2006 à 14:55:12    

Pardon pour le post inutile (erreur de manip)
 
A ma connaissance, il est impossible de faire un "return" parce que le code ne peut pas être séquentiel en asynchrone. Il faut donc remplacer le alert par une deuxième fonction qui traite le responseText et répercute les modifications dans l'écran.

Reply

Marsh Posté le 06-11-2006 à 15:40:31    

Je sais que je pourrais le faire avec un "innerHTML" par example, mais j'aimerais avoir l'expertise de plusieurs personnes, question de voir ce qui est possible.

Reply

Sujets relatifs:

Leave a Replay

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