Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1244 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  Ajax : difficultés sur le mode asynchrone

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ajax : difficultés sur le mode asynchrone

n°1475588
benjones
Posté le 15-11-2006 à 10:09:51  profilanswer
 

Bonjour à tous,
 
Je suis actuellement confronté à un problème sur mon site. En effet, j'ai créer un fonction js qui s'occupe  d'effectuer les traitements ajax et retourne le résultat renvoyé par le serveur.
 
Voici à quoi ressemble cette fonction :
 
////////////////////////////////////////////////////////////////////////////
// script : url du script serveur à atteindre (ex : test.php)
// donnees : donnees formattees get ou post (ex : "toto=1&tata=2" )
// methode : "post" ou "get"
// mode (1 pour synchrone, tout autre valeur pour asynchrone)
////////////////////////////////////////////////////////////////////////////
function js_client_serveur(script, donnees, methode, mode)
{
  // Déclaration de notre objet ajax
  var xhr_object = null;
   
  // On déclare la variable de résultat
  var resultat = null;
 
  // Contrôle de la compatibilité navigateur
  if(window.XMLHttpRequest)
  {
    // Firefox
    xhr_object = new XMLHttpRequest();
  }
  else if(window.ActiveXObject)
  {
    // Internet Explorer
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  }
  else
  {
    // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..." );
    return;
  }
 
  // Si on a choisi le mode synchrone
  if(mode == 1)
  {
     xhr_object.open(methode, script, false);
     
     if(methode.toUpperCase() == "POST" )
     {
        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded" );
     }
 
     xhr_object.send(donnees);
     resultat = xhr_object.responseText;
  }
  else
  {
     xhr_object.open(methode, script, true);
     xhr_object.onreadystatechange = function()
                                     {
                                 if(xhr_object.readyState == 4)
                                 {
                                            resultat = xhr_object.responseText;
                                        }
                                     }
                                     
     if(methode.toUpperCase() == "POST" )
     {
        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded" );
     }
 
     xhr_object.send(donnees);
  }
   
  return resultat;
}
 
Le problème que je rencontre c'est que je suis obligé de mettre en mode synchrone, car le résultat renvoyé me sert pour effectué d'autres traitements. Or, le principe du traitement asychrone est justement de ne pas bloquer le navigateur, ce qui fait que mon script Javascript continue de s'éxécuter sans attendre que ma fonction ne lui retourne de valeur.
 
Ce qui m'interesse c'est d'utiliser le mode asynchrone pour récupérer mes infos car j'ai certains traitement qui peuvent prendre plusieurs secondes (fonction js_client_serveur dans une boucle) et pendant ce temps le navigateur reste figé, ce qui n'est pas très agréable aux yeux des utilisateurs.
 
Y a t'il un moyen de remédier a mon problème ?
 
Merci.

mood
Publicité
Posté le 15-11-2006 à 10:09:51  profilanswer
 

n°1475750
benjones
Posté le 15-11-2006 à 12:26:01  profilanswer
 

Bon vu le nombre de réponses, j'en déduis que mon problème est irrésolvable ^^.
 
Je vais tâcher de résumer mon problème en une question :
Est-il possible d'attendre le résultat de l'éxécution d'une fonction ajax en mode asynchrone (Afin d'éviter de figer le navigateur) ?
 
Dans le cas contraire, est-il possible de forcer la sortie de script si l'éxécution prend trop de temps ?
 
Merci beaucoup.


Message édité par benjones le 15-11-2006 à 12:26:20
n°1475785
brisssou
8-/
Posté le 15-11-2006 à 13:25:33  profilanswer
 

irrésolvable > insoluble (dans l'eau)
 
sinon, la réponse est oui : tu peux faire de l'asynchrone. Ensuite personne ne répond parce que je pensent que tu utilises juste mal le concept (enfin j'ai l'impression).
 
Dans ta fonction, qu'est ce qui se passe si tu fais de l'asynchrone ? tu renvoies null. Vérifie la logique de ton truc, ça m'a l'air étrange.
 
N.B. : chui pas une bête en JS/Ajax, c'est juste pour faire un post qui soit pas de toi et lancer le débat :)


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1475789
benjones
Posté le 15-11-2006 à 13:40:37  profilanswer
 

Merci pour ta réponse, je me sens moins seul. Il est vrai que vu comment est écrite ma fonction, faire de l'asynchrone et retourner une valeur semble impossible. J'aimerai cependant garder le concept d'une fonction ayant le but d'effectuer toute la moulinette Ajax, pour que dans mon script principal j'ai simplement à l'appeler pour communiquer avec le serveur.
 
Le seul moyen que je vois pour rentabiliser ma fonction serait donc d'utiliser le mode synchrone lorsque j'ai besoin de récupérer le résultat, le mode asynchrone lorsque j'ai juste besoin d'envoyer des données au serveur. Partant de là je pense que j'ai quand même écrit du code utile.
 
Pour aller plus loin, est-il possible de passer une fonction en paramètre d'une autre ? (Mais de quoi il parle ???? :p).
Je m'explique : est-il possible de passer la fonction à éxécuter lorsque ReadyState vaut 4 à ma fonction Ajax ?
 
Exemple :
 
function js_client_serveur(script, donnees, methode, mode, nom_fonction)
{
   ...
    if(xhr_object.readyState == 4)
                                 {
                                            nom_fonction() //Appel de la fonction
                                    }
                                       
}  
 
J'espère que vous aurez compris ce que j'essai de demander et que ce n'est pas trop du bricolage.
 
Merci énormément.


Message édité par benjones le 15-11-2006 à 13:43:11
n°1475793
benjones
Posté le 15-11-2006 à 14:00:27  profilanswer
 

Et la réponse et oui !!
 
Je viens de faire mes tests avec succès ! Il est en effet possible de passer une fonction en paramètre !!
 
Je défini donc tous mes traitements post-ajax dans une fonction que je passe a ma fonction ajax et tout s'éxécute à merveille !!
 
Conclusion :
* J'ai réussi a créer une fonction qui fait toute la moulinette Ajax, donc simplification des requêtes client-serveurs
* J'ai réussi à l'utiliser à la fois en mode synchrone et asynchrone.
 
Si ça interesse quelqu'un, je peux poster la nouvelle versiion de ma fontion Ajax js_client_server.
 
Merci brisssou pour ton soutien moral qui m'a donné la force de pousser ma réflexion :p ^^

n°1583161
max_fly
Posté le 06-07-2007 à 12:12:46  profilanswer
 

benjones a écrit :

Si ça interesse quelqu'un, je peux poster la nouvelle versiion de ma fontion Ajax js_client_server


 
Bonjour,
 
Oui, ça m'intéressse ! J'ai le même problème (attendre le retour d'une fonction pour en appeler une autre) et je commence à me perdre dans tout ça...
 
Merci d'avance...

n°1583176
bignose
Posté le 06-07-2007 à 13:07:24  profilanswer
 

Pour travailler en mode asynchrone,  voila comment je ferais :
Je spliterai la fonction js_client_server en 2 parties pour le mode asynchrone,  la première est la fonction elle-mème,  la deuxième est une fonction qui ne fait qu'attendre les résultats.
js_client_server lance l'attente via un setTimeout() de la seconde fonction.  Celle-ci vérifie si les données sont arrivées,  si oui elle ne se relance pas et met ces données là où il faut,  sinon,  elle se relance via un setTimeout().
La fonction js_client_server doit ètre modifiée pour tenir compte de cela,  après l'exécution de setTimeout() il faut sortir :
     xhr_object.send(donnees);  
    setTimeout(attend_donnees(), 1000);
    return;
 
Qu'est-ce que tu en penses ?

n°1583184
cgo2
Dum spiro spero
Posté le 06-07-2007 à 13:21:17  profilanswer
 

C'est n'importe quoi, pas besoin d'un timeout puisqu'on peut définir une fonction callback qui sera appellée toute seule au bon moment  :
 
xhr.onreadystatechange = mafonctioncallback;
 
Il faut simplement que vous compreniez que le fait de "placer" le callback n'est pas bloquant, et que le code continu à s'executer comme si de rien était. "mafonctioncallback" n'est pas executée tout de suite, mais seulement quand la requete sera complète (ce qui peut survenir à n'importe quel moment selon la vitesse de connexion, le temps de réponse, la taille de la page à charger, etc.).


---------------
When it's from Finland it's good.  - Mon blog
n°1613780
MetalDestr​oyer
Posté le 21-09-2007 à 11:58:32  profilanswer
 

Désolé de remonter le topic :D Mais j'ai un problème similaire. Attention, je peux faire que du javascript dans mon cas (à cause des limitations de la CRM 3.0 de Microsoft).
 
J'ai une fonction qui ouvre/ferme la connexion à une base de donnée SQL Server (la connexion se fait uniquement en javascript et ActiveX). En lancant la requete SQL, le navigateur bloque et attent le retour. Le problème c'est sa. Je veux pas qu'il bloque mais me permet d'utiliser la navigateur entre temps. Le problème, c'est que je ne vois pas comment implémenter le concept de XmlHttpRequest quand le traitement s'effectue directement dans la même page. Surtout que je ne peux malheureusement pas modifier le code coté serveur (ASPX, C#). D'ailleurs je doute que je puisse avoir les sources de l'appli CRM.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  Ajax : difficultés sur le mode asynchrone

 

Sujets relatifs
[BATCH]Changer mode de compatibilité en ligne de commandeAJAX - Taille maximale de retour
[AJAX] Comment gérer les clients ? (jeu multi)[PHP/Ajax/XSL/CSS/Etc] Explorateur Web
Un bon livre sur AJAX en français?Ajax en asychrone
mode arrière plan sous batch??Vérifier qu'un site répond (en Javascript - AJAX ?)
Activer JS dans une page appelée en AjaxMode tuareg de xemacs sous windows
Plus de sujets relatifs à : Ajax : difficultés sur le mode asynchrone


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR