IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Instructions exécutées dans le désordre


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut [AJAX] Instructions exécutées dans le désordre
    Bonjour,
    J'ai un problème qui va certainement apparaitre normal pour nombreux d'entre vous car Ajax est "asynchrone", mais pourtant je ne trouve pas la solution...

    Pour vérifier l'exécution de mon scritpt, j'ai mis des balises "ici 1", "ici 2", etc. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function ajaxtp(element)
     {
      getXhr();
      xhr.onreadystatechange = function()
    alert('ici 1, element vaut '+element);
       {
    alert('ici 2, element puis readyState valent '+element+', readyState vaut '+xhr.readyState+', status vaut '+xhr.status);
        if(xhr.readyState == 4 && xhr.status == 200)
         {
    alert('semble ok, ici 3, element vaut '+element);
          // Nous remplacons le contenu du div iris par le retour de "ajax/ajaxtp.php"
          document.getElementById(element).innerHTML = xhr.responseText;
         }
       }
    alert('ici 4, element vaut '+element);
      xhr.open("POST",'ajax/ajaxtp.php',true);
    alert('ici 5, element vaut '+element);  
      xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      // On recupere la valeur de l'input ayant pour id: nserie
    alert('ici 6, element vaut '+element);
      //...
      // On envoie a verifnserie le nserie recupéré
    alert('ici 7, element vaut '+element);
      xhr.send("element="+element);
    alert('ici 8, element vaut '+element);
      }
    Or, quand je l'exécute, l'affiche se fait dans le désordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ici 2, element puis readyState valent 4, readyState vaut 0, status vaut 0
    ici 4, element vaut 4
    ici 1, element vaut 4
    ici 5, element vaut 4
    ici 6, element vaut 4
    ici 7, element vaut 4
    ici 1, element vaut 4
    ici 1, element vaut 4
    ici 1, element vaut 4
    ici 1, element vaut 4
    ici 8, element vaut 4
    Là, je suis perdu !
    Merci à vous pour vos pistes

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    1-
    xhr.onreadystatechange = function()
    alert('ici 1, element vaut '+element);
    {
    C'est bizarre que ça marche .

    2- Que veux-tu faire? Je ne vois pas trop l'intérêt de vérifier la valeur de "element" à chaque étape comme ça sans que tu lui affectes une nouvelle valeur.

    3- Tu peux aussi travailler en mode synchrone si c'est ton soucis.

    A+.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut
    Merci Andry,
    Citation Envoyé par andry.aime Voir le message
    1-
    xhr.onreadystatechange = function()
    alert('ici 1, element vaut '+element);
    {

    C'est bizarre que ça marche
    Ah oui je ne m'en étais pas aperçu...
    Je viens de replacer l'alerte "ici1" après l'accolade, soit juste avant "ici 2", et l'ordre d'affichage est le même (ça affiche d'abord 2, 4 puis 1, etc comme dans le message initial)

    Citation Envoyé par andry.aime Voir le message
    2- Que veux-tu faire? Je ne vois pas trop l'intérêt de vérifier la valeur de "element" à chaque étape comme ça sans que tu lui affectes une nouvelle valeur.

    3- Tu peux aussi travailler en mode synchrone si c'est ton soucis.
    2 - Pour l'instant je débute, et je veux vérifier l'ordre d'exécution de chaque fonction, d'où mes alertes.

    3 - J'utilise onreadystatechange et je fais un test xhr.readyState == 4, donc je suis théoriquement en mode synchrone, non ?
    Et pourtant au vu de l'affichage des balises "ici", ça reste asynchrone...
    Ce qui m'embête, c'est que jamais le "ici 3" ne s'affiche...

    Merci si vous avez d'autres idées

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonsoir,
    J'utilise onreadystatechange et je fais un test xhr.readyState == 4, donc je suis théoriquement en mode synchrone, non ?
    Non, tu travailles en toujours en mode asynchrone. Si tu veux travailler en mode synchrone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function ajaxtp(element)
     {
      getXhr();
      xhr.open("POST",'ajax/ajaxtp.php',false);
      xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      xhr.send("element="+element);
      document.getElementById(element).innerHTML = xhr.responseText;
      }
    xhr est-il déclaré comme variable globale?

    A+.

  5. #5
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Par défaut
    Salut,

    Citation Envoyé par papa6
    jamais le "ici 3" ne s'affiche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(xhr.readyState == 4 && xhr.status == 200)
    Parce que dans ton cas, xhr.status est égale à 0 et non 200.
    ici 2, element puis readyState valent 4, readyState vaut 0, status vaut 0
    Tu testes en local ?

    Ensuite pour le test, tu ne devrais pas utiliser alert() mais plutôt écrire le résultat dans une div par exemple.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut
    Merci à tous les 2

    Ça fait autour d'un an que j'avais arrêté de m'intéresser à ajax à cause de l'asynchrone... Et là, c'est bon, vous m'avez débloqué (je n'osais pas poster, je croyais que c'était moi qui lisais mal les tutoriels)

    Andry, merci pour ton code, j'y ai mis mes alertes (ok Éric 2A, je ferais des div, mais j'avais les alertes sous la main ), et elles se sont toutes affichées dans l'ordre.
    Maintenant, je vais pouvoir travailler dessus.

    À part ça, je ne sais plus si j'avais mis xhr comme variable globale (ces scritps remontent à un an...), mais je vais le garder à l'esprit.
    Et sinon, je teste directement sur un serveur distant (je pense que c'est mieux avec des délais de réponse un peu plus longs).

    Donc encore merci, et à bientôt

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ce qui m'embête, c'est que jamais le "ici 3" ne s'affiche...
    C'est simplement dû au fait que le readyState 3 correspond à la phase de transmission des données, mais si tu as suffisamment peu de données à envoyer, elles le seront en un seul paquet, donc l'état "en cours de transmission" sera aussitôt remplacé par "tout a été envoyé" (readyState 4).
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Citation Envoyé par papa6 Voir le message
    Et sinon, je teste directement sur un serveur distant (je pense que c'est mieux avec des délais de réponse un peu plus longs).
    Tu peux tester en local, en mettant un sleep dans le fichier appelé.

    A+.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [script.aculo.us] Ajax.Updater, evalscripts et onSuccess, dans le désordre
    Par tchize_ dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 17/01/2013, 16h55
  2. Instructions interprétées dans le désordre
    Par louisss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/12/2012, 14h56
  3. Instruction SQL dans un bouton pour filtrer info formulaire
    Par beegees dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 05/09/2005, 13h26
  4. Priorité d'exécution dans une dll
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2005, 15h59
  5. Réponses: 2
    Dernier message: 21/10/2004, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo