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

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    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
    Points : 15 059
    Points
    15 059
    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 habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    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
    Points : 15 059
    Points
    15 059
    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 émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    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 habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    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).

  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
    Points : 15 059
    Points
    15 059
    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+.

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Vraiment tout va bien maintenant, le problème est résolu. Là je suis en train de paufiner

    Mon erreur provenait du fait que j'étais en asynchrone alors que je m'attendais à du synchrone (c'était mon problème d'il y a un an, avec un script pour Google Maps).

    La solution est celle d'andry.aime :
    true = asynchrone, et false = synchrone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     xhr.open("POST",'monfichier.php',false);

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Bien content d'arriver à une mini-page, j'en profite pour la citer :
    http://tirezpas.com

    C'est une page "bête", il faut cliquer sur des noms de personnes qu'on n'aime pas trop pour faire monter leur score.

    Au niveau programmation, si certains sont intéressés, je peux publier le code.

    En tout cas, je suis bien content d'y être arrivé (autosatisfaction ), et merci pour votre aide !

+ 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