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] Test retour requête => bloquage


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut [AJAX] Test retour requête => bloquage
    Bonjour

    Je viens de voir que je traitais trop tôt le retour de l'appel AJAX. Je me suis dit, pas grâve, il suffit d'attendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (xhr.readyState!=4);
    Comme l'attente bloquait le système, j'ai rajouté une première série de marqueurs (innerHTML). Comme ça bloquait encore, j'ai rajouté des alert, et là, ça passe sans problème :
    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
    27
    28
    29
    30
    31
    32
      xhr.open("GET",url,true);
      xhr.send(null);
      anc=-1;
      while (xhr.readyState!=4)
      {
       if (xhr.readyState==0 && anc!=0)      
       {
        document.getElementById("liste").innerHTML="<p>Requête Non initialisée</p>";
        alert("<p>Requête Non initialisée</p>");
        anc=0
       }
       else if (xhr.readyState==1 && anc!=1)
       {
        document.getElementById("liste").innerHTML="<p>La requête vient de s'ouvrir</p>";
        alert("<p>La requête vient de s'ouvrir</p>")
        anc=1
       }
       else if (xhr.readyState==2 && anc!=2)
       {
        document.getElementById("liste").innerHTML="<p>La requête vient d'être envoyée</p>";
        alert("<p>La requête vient d'être envoyée</p>")
        anc=2
       }
       else if (xhr.readyState==3 && anc!=3)
       {
        document.getElementById("liste").innerHTML="<p>Les données arrivent</p>";
        alert("<p>Les données arrivent</p>");
        anc=3
       }
      }
     
      return xhr
    Ceci dit, je me passerai bien de la fenêtre générée par le alert et j'aimerai bien que ça marche !

    nb : la fenêtre du alert m'indique "La requête vient de s'ouvrir". Et après, je sorts et tout va bien.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    en asynchrone, tu n'as pas besoin d'attendre explicitement (c'est à dire via une boucle comme tu l'as fait) le retour d'Ajax : la propriété onreadystatechange, à laquelle tu associes une fonction anonyme qui fera le traitement de la réponse, est là pour ça

    A+

  3. #3
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Ta boucle while est superflue ici et pourrait être avantageusement remplacée par l'utilisation de la propriété onreadystatechange.

    Classiquement, cela donne : (exemple en GET)

    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
    try {
       var xhr = getXhr();
       xhr.onreadystatechange = function() {
          if (xhr.readyState == 4) {
             if (xhr.status == 200) {
                // traitement au retour de l'appel
             }
             else {
                // traitement d'erreur (serveur)
             }
          }
       }
       xhr.open("GET", tonUrl, true);
       xhr.send(null);
    }
    catch (e) {
       // traitement d'erreur (local)
    }

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Merci pour vos réponses.

    Ce que je vous ai montré est en fait une fonction qui retourne un xhr que j'aimerai savoir complet lors d'un return qui se trouve juste à la fin du code (rajout fait maintenant).

    Pour le moment, j'ai effectivement déjà utilisé onreadystatechange en réception de la fonction. Mais je ne souhaite pas :
    1) modifier tous mes appels déjà fait
    2) mettre un onreadystatechange après tous mes futurs appels : je préférerais un code plus simple.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par troumad Voir le message
    2) mettre un onreadystatechange après tous mes futurs appels : je préférerais un code plus simple.
    Heu ... c'est la manière la plus simple de coder cette partie là ...

    A+

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Citation Envoyé par E.Bzz Voir le message
    Heu ... c'est la manière la plus simple de coder cette partie là ...
    C'est bien ce qu'il m'a semblé. Le reste est plus compliqué , mais pas infaisable j'espère !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Finalement, ce que tu souhaites semble plus ressembler à des appels synchrones ...
    Tu as essayé, pour voir si ça correspond au fonctionnement de ta page ?
    (dans ce cas, pas de onreadystatechange )

    A+

  8. #8
    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 : 54
    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
    Citation Envoyé par troumad Voir le message
    Pour le moment, j'ai effectivement déjà utilisé onreadystatechange en réception de la fonction. Mais je ne souhaite pas :
    1) modifier tous mes appels déjà fait
    2) mettre un onreadystatechange après tous mes futurs appels : je préférerais un code plus simple.
    Rien ne t'empêche de mettre le onreadystatechange dans ta création du xhr :
    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
    xhr.open("GET",url,true);
      xhr.send(null);
      xhr.onreadystatechange = function(){
       if (xhr.readyState==0)      
       {
        document.getElementById("liste").innerHTML="<p>Requête Non initialisée</p>";
        alert("<p>Requête Non initialisée</p>");
       }
       else if (xhr.readyState==1)
       {
        document.getElementById("liste").innerHTML="<p>La requête vient de s'ouvrir</p>";
        alert("<p>La requête vient de s'ouvrir</p>");
       }
       else if (xhr.readyState==2)
       {
        document.getElementById("liste").innerHTML="<p>La requête vient d'être envoyée</p>";
        alert("<p>La requête vient d'être envoyée</p>");
       }
       else if (xhr.readyState==3)
       {
        document.getElementById("liste").innerHTML="<p>Les données arrivent</p>";
        alert("<p>Les données arrivent</p>");
       }
      }
     
      return xhr
    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

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Rien ne t'empêche de mettre le onreadystatechange dans ta création du xhr :
    Ta méthode ne certifie pas que lors du retour de la fonction, l'appel est complètement fini avec un retour complet de l'information.
    Mon but est de me passer de l'alert qui n'est pas que pour débugger !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par troumad Voir le message
    Ta méthode ne certifie pas que lors du retour de la fonction, l'appel est complètement fini avec un retour complet de l'information.
    Si, de même que dans les autres codes.
    Dès que les conditions ci-dessous sont réunis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          if (xhr.readyState == 4) {
             if (xhr.status == 200) {
    c'est que le retour est complet.
    Or le test est réalisé par l'objet xhr lui-même, à chaque fois que l'"état" de la requête change (d'où le nom), ce qui fait que c'est de cette manière que tu as la meilleure information sur l'avancement (et donc la complétude) de ta requête ...

    A+

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

Discussions similaires

  1. Requête Ajax et retour undefined
    Par DiverSIG dans le forum jQuery
    Réponses: 5
    Dernier message: 23/05/2017, 15h48
  2. [AJAX] Retour d'un json dans Ajax d'une requête Mysql
    Par laplumedoie dans le forum AJAX
    Réponses: 11
    Dernier message: 16/03/2013, 09h15
  3. [AJAX] Enchainer plusieurs requêtes avec Ajax
    Par Bobtop dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/08/2006, 08h13
  4. Réponses: 9
    Dernier message: 07/04/2006, 14h33
  5. [AJAX] Ajax en retour undefined
    Par Tempotpo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/04/2006, 10h47

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