Code s'exécutant "trop rapidement"

Résolu
Signaler
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
-
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
-
Hello,

J'ai un problème bizarroïde : j'ai une fonction de contrôle en Ajax "treatProb" sur un formulaire qui en cas de succès met "1" dans un champ hidden, "0" sinon.

Ce résultat est utilisé ensuite dans mon code. Mais voilà, on dirait que ma fonction ajax met à jour trop lentement le champ de contrôle ou que la suite du code va trop vite car systématiquement la suite du code s'exécute un instant avant la mise à jour du champ :








// PARTIE AJAX
function getHTTPObject() {
    ...
}
var http = getHTTPObject();
function treatProb (){
    ...
   http.onreadystatechange = handleHttpResponse;
   ...
}
   
function handleHttpResponse() {    if (ret !'1') document.getElementById(' controle ').value '0';
    else document.getElementById('controle').value = '1';
    ...
}

// APPEL DANS MON CODE
treatProb ()
if (document.getElementById('controle').value ! = '1') alert("Problème.");
else alert('Ok!');



Si je clique sur mon bouton submit et que le contrôle en Ajax est un succès, j'ai droit à "Problème". Si je reclique sans rien modifier, c'est "Ok!"...

Tests à l'appui "alert("Problème.")" s'exécute avant que treatProb() ait mis à jour le champt "controle"...

Une idée ??

Merci d'avance,
Malik7934

8 réponses

Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
12
tel que tu nous décris ça semble devoir baigner
et ça ne le fais pas... difficile "sans voir"
quelques pistes :
__ retourner 0 ou 1 et tester responseText
__ j'utilise "toujours" le même style :

fonction ajax :
                http.onreadystatechange = function()
                {    if(http.readyState == 4)
                    {   on peut traiter la réponse http.responseText    }
                }
                http.open("POST ou GET", "http://....", true);
                http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
                ....
                http.send("paramètres");

ah.... je viens de percuter !
treatProb(); if (document.getElementById('controle').value != '1') alert("Problème."); else alert('Ok!');"
en javascript, on n'attend pas la fin du fonction pour continuer !
c'est à dire on lance la fonction treatProb(); et immédiatement on continue
à l'instruction suivante
tu devrais faire comme dans mon exemple.

Cordialement[mon Site][M'écrire]Bul
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
12
bonjour,
http.onreadystatechange = handleHttpResponse;
ta requète est en asynchrone ?
oui : faut attendre que le readystate passe à 4
ajax envoi des infos ( avec readystate != 4 ) en cours de traitement
Cordialement[mon Site][M'écrire]Bul
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Salut,

Pas sûr de comprendre ta réponse... quoi qu'il en soit il est à 4 :

function handleHttpResponse() {
    if (http.readyState == 4) {
        if (http.responseText.indexOf('invalid') == -1) {
            var xmlDocument = http.responseXML;
            var ret = xmlDocument.getElementsByTagName('rep').item(0).firstChild.data;

            if (ret != '1'){
                  ....

Merci pour ton aide
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Correction : "if (http.responseXML.indexOf('invalid') == -1)" et pas "if (http.responseText.indexOf('invalid') == -1) ", mais ça ne change rien...
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
12
>>quoi qu'il en soit il est à 4 :
ah ben.. on ne le voyait pas ça.

>>var ret = xmlDocument.getElementsByTagName('rep').item(0).firstChild.data;
tu as fait un alert de ret ?  de responseXML ?
quoi qui n'y-a dedans ?

[mon Site][M'écrire]Bul
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Re-

Effectivement, je ne voulais pas mettre trop de code et j'ai râpé l'important.

responseXML est bête comme chou. Il vaut par exemple : <rep>0</rep>
Je récupère ensuite le contenu du tag "rep", soit le 0, et le stocke dans controle ()

J'ai fait un alert, et il a bien la valeur attendue. Mon problème est clairement dû au fait que dans "



treatProb(); if (document.getElementById('controle').value != '1') alert("Problème."); else alert('Ok!');" ce qui suit treatProb() s'exécute avant que treatProb est pu stocker la valeur retour dans controle...
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Salut,

Merci pour ta réponse.

Je ne savais pas que Javascript n'attendait pas la fin de l'exécution d'une fonction pour passer à la suite. Je trouve cela plutôt bizarre comme spécificité... anyway, j'ai suivi ton conseil et je m'en suis sorti, mais en utilisant une autre méthode que le stockage dans un champ "controle" car j'ai la nette impression que le problème d'exécution se répercute sur des bouts de codes tels que "http.onreadystatechange = function(){}".

Du coup, j'ai au final :

        var isWorking = false;
        var http = new XMLHttpRequest();

        if (!isWorking && http) {
            var v = document.getElementById('verif').value;

            http.open("GET", "controle.php?v=" + escape(v), true);
            http.onreadystatechange = function(){
                if (http.readyState == 4) {
                    if (http.responseText.indexOf('invalid') == -1) {
                   
                        var xmlDocument = http.responseXML;
                        var ret = xmlDocument.getElementsByTagName('rep').item(0).firstChild.data;
                        if (ret != '1'){
                            alert("Vous avez mal recopié le code de vérification.");
                            return false;
                        }                       
                        isWorking = false;
                    }
                }           
            };
            isWorking = true;
            http.send(null);
        }



Pas vraiment portable, mais au moins cela fonctionne

Merci bien !
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
12
>>
Je trouve cela plutôt bizarre comme spécificité...
s'il existait la possibilité de le faire sans siouxer...
je ne serais pas d'accord avec toi,
mais effectivement, ça peut poser des problèmes
au moins d'écriture


nickel si tout baigne
et merci du retour.

[mon Site][M'écrire]Bul