Ajax : difficultés sur le mode asynchrone - HTML/CSS - Programmation
Marsh Posté le 15-11-2006 à 12:26:01
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.
Marsh Posté le 15-11-2006 à 13:25:33
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
Marsh Posté le 15-11-2006 à 13:40:37
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 ???? ).
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.
Marsh Posté le 15-11-2006 à 14:00:27
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 ^^
Marsh Posté le 06-07-2007 à 12:12:46
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...
Marsh Posté le 06-07-2007 à 13:07:24
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 ?
Marsh Posté le 06-07-2007 à 13:21:17
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.).
Marsh Posté le 21-09-2007 à 11:58:32
Désolé de remonter le topic 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.
Marsh Posté le 15-11-2006 à 10:09:51
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.