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

  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 : 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
    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
    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
    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 )
    Je viens d'essayer, il me semble que tu touches à la vérité.
    Mon essai a été un echec. Je dois aller manger... Je continuerais demain. Autre chose à l'emploi du temps de cette après midi !
    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...

  11. #11
    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+

  12. #12
    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
    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 ...
    Selon moi le retour de ma fonction n'aura lieu que si lors du passage sur le test, l'appel est fini. Sinon, il n'y aura pas de retour !
    Non ?
    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...

  13. #13
    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
    Selon moi le retour de ma fonction n'aura lieu que si lors du passage sur le test, l'appel est fini. Sinon, il n'y aura pas de retour !
    Pas bien compris ....
    Mais le "passage sur le test" a lieu à chaque modification de l'état du xhr, jusqu'à réception de la réponse (un peu ce que tu fais dans ta boucle) ...
    Il passe donc forcément sur le test lors de la réception de la réponse (même si le test a été fait sans succès plusieurs fois précédemment).

    Mais je te laisse tester la version synchrone

    A+

  14. #14
    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
    Pour ma part, ce que je ne comprends pas, c'est pourquoi vouloir renvoyer l'objet xhr une fois la requête terminée
    Mais apparemment, c'est bien une requête synchrone dont tu as besoin...
    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

  15. #15
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    De la façon dont Bovino l'a écrit, le retour de ta fonction se fait immédiatement après l'envoi de la requête, ce qui est tout a fait normal lors d'un appel asynchrone (tu crées un autre processus qui va effectuer le traitement, donc le processus "pere", continue de s'exécuter immédiatement, quoi que fasse le processus "fils").

    A mon avis, tu prends le problème a l'envers: plutot que d'attendre la fin de la requete pour retourner ton objet xhr et effectuer le morceau de code suivant, tu devrais soit:
    - exécuter le code suivant dans la fonction de rappel des que la requete est terminée
    - passer ta requete en synchrone, mais cay le mal (hors besoins tres particuliers)

    Exemple pour la premiere solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function ajax(url, onComplete)
    {
     var xhr = getXhr();
     xhr.onreadystatechange = function(xhr)
     {
       if(xhr.readystate == 4 && xhr.status == 200)
       {
         onComplete(xhr).
       }
     }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function maFonctionAExecuterApresLaRequete(xhr)
    {
     // du code a exécuter
    }
     
    // du code avant
    ajax("uneUrl",maFonctionAExecuterApresLaRequete)

    De cette façon, tu t'assures que la requete est bien terminée pour exécuter ton code (c'est la méthode employée par tous les frameworks javascript).

  16. #16
    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
    J'ai pris ton idée DoubleU, mais tu avais oublié une majuscule...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      xhr.onreadystatechange = function()
      {
       if(xhr.readyState == 4 && xhr.status == 200)
       {
         fonction(xhr.responseText,param)
       }
      }
    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...

  17. #17
    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
    C'est le fonctionnement classique d'Ajax en mode asynchrone

    A+

  18. #18
    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
    Oui, mais je ne savais pas qu'on pouvais envoyer en javascript le nom d'une fonction en paramètre
    On dirait que ça ressemble à du C
    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...

+ 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