Prenez le code jQuery suivant :
function validerServeur(value) {
var valide;
$.get("valide.php", { valeur: value }, function(data) {
valide = (parseInt(data) === 1) ? true : false;
}
return valide;
}
Ce code effectue une requête AJAX au serveur et retourne si une valeur est valide ou non. Le problème? Lorsque $.get est appellée, la fonction continue, et le return valide est exécutée, alors que le callback de la requête AJAX n’a pas encore été exécutée! Et il n’est pas possible d’effectuer le code suivant :
valide = (parseInt(data) === 1) ? true : false;
return valide;
Puisque le scope est sur l’objet $.get. Que faire, alors? La réponse est : « requête AJAX synchrone ». On peut effectuer des requêtes synchrones avec jQuery à l’aide de la méthode $.ajax qui est l’élément « parent » de la méthode $.get comme je l’avais expliqué dans « Entêtes HTTP, AJAX et jQuery ». Le code à utiliser est donc le suivant :
function validerServeur(value) {
var valide;
$.ajax(
url: "valide.php",
data: { valeur: value },
async: false,
succes: function(data) {
valide = (parseInt(data) === 1) ? true : false;
}
)
return valide;
}
Lorsqu’on ajoute le paramètre async: false, on demande au navigateur d’arrêter l’exécution du script en cours tant que la requête n’est pas complétée. Cela interrompt l’exécution du code Javascript, mais cela nous permet de récupérer notre valeur, et de la retourner par la suite.
Et c’est ainsi que dès que la réponse est longue (serveur chargé, problème réseau, etc etc), le navigateur de ton utilisateur est bloqué.
Jamais, au grand jamais, faire de l’AJAX synchrone.
Rik (11 décembre 2007 à 13:34 EST)
Bon, c’est bien beau cette belle déclaration, mais as-tu une solution concrète à mon problème? ;-)
Rémi Prévost (11 décembre 2007 à 15:18 EST)
Bah de l’asynchrone. Avec un joli truc qui tourne en rond pour indiquer qu’il faut patienter au visiteur si c’est un service obligatoire, sans indication visuelle si c’est juste « du bonus ».
Rik (13 décembre 2007 à 16:22 EST)
de l’ajax synchrone c’est plus de l’ajax dans ce cas ^^
mEga (18 décembre 2007 à 11:38 EST)
En effet, on devrait appeler ça du SJAX!
Rémi Prévost (18 décembre 2007 à 15:33 EST)