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

JavaScript Discussion :

XmlHttpRequest: retour tardif des données


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Par défaut XmlHttpRequest: retour tardif des données
    Bonjour,

    J'ai une appli JavaScript qui doit prendre des données dans une base et cela fonctionne très bien. Mon problème est que pendant que la requête se fait, l'appli doit rester disponible à l'utilisateur (car mon serveur est un peu long à la détente). J'ai donc fait en sorte d'utiliser le mode asynchrone. Mais Firefox me renvoie une erreur sur une variable qui n'est pas à jour au bon moment, car elle est utilisée AVANT sa mise à jour par la requête. Dans les précedents posts, certains ont eu ces problemes et utilisés une attente. Malheureusement plusieurs problèmes : cela bloque l'utilisateur pendant la durée de l'attente et si le serveur est particulièrement long, l'attente se termine avant la fin de la procédure, pas bien fiable donc...

    Voici un bout de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function CAL_init() {
        res = sendData();
        alert(res);
        CAL_placeEvent("", res[1]);
    }
    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
    function sendData() {
        var xhr_object = null; 
        var result;
     
        if(window.XMLHttpRequest) // Firefox 
            xhr_object = new XMLHttpRequest(); 
        else {
            alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
            return;    
        } 
     
        xhr_object.open("POST", "cal.php", true);   
     
        xhr_object.onreadystatechange = function() { 
            if(xhr_object.readyState == 4) {
                result = xhr_object.responseText.split(",");
                return result;
            }
        } 
     
        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");    
        xhr_object.send(null); 
    }
    Le prog PHP fait un SELECT qui renvoie les données de la base : marche très bien !
    La variable result est retournée pour initialiser la variable res de la fonction init() le problème est que la procédure se termine (donc après avoir exécuter l'instruction xhr_object.send(null) avant le retour des données et retourne donc un résultat 'undefined'. En mettant des alert() aux bons endroits j'ai pu me rendre compte que les données étaient bien retournées mais après...

    Sans mettre un sleep ou wait ou je ne sais quelle attente, comment pourrais je faire pour attendre le retour des données sans bloquer l'utilisateur ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    faire la requete en asynchrone ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Par défaut
    Ben ça y est !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xhr_object.open("POST", "cal.php", true);
    true ca veut bien dire que j'ai activé le mode asynchrone, non ???

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    oui c'est pour cela que j'ai mis un point d'interrogation car ça ne devrait pas bloquer l'utilisateur ...

    à ce moment là met une boucle while avec un test sur la variable en question ...
    et accessoirement un increment pour eviter une boucle infinie voire une boucle for inférieure au max d'ittérrations
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Par défaut
    oui j'y ai pensé mais lorsque le while est en cours cela bloque l'utilisateur. Il ne peut pas continuer à utiliser l'appli pendant que les données arrivent ...

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2006
    Messages : 245
    Par défaut
    Bon j'ai trouvé !
    Je met le code si cela intéresse quelqu'un :

    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
    function CAL_sendData() {
        var xhr_object = null; 
        var result;
     
        if(window.XMLHttpRequest) // Firefox 
            xhr_object = new XMLHttpRequest(); 
        else {
            alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
            return;    
        } 
     
        xhr_object.open("POST", "cal.php", true);   
     
        xhr_object.onreadystatechange = function() { 
            if(xhr_object.readyState == 4) {
                result = xhr_object.responseText.split(",");
                CAL_placeEvent("", result[1]);
            }
        } 
     
        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");    
        xhr_object.send(null); 
    }
    En fait je me passe carrément de la fonction init() et de la variable ! Je fait appel à la fonction dans le onreadystatechange. Si quelqu'un trouve le moyen de faire attendre la variable et donc de ne pas se passer de la variable, je suis preneur !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/08/2014, 08h48
  2. Classes PHPTelnet et taille des donnée de retour de commande telnet
    Par pofexpray dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 11/08/2014, 11h26
  3. Retour des données
    Par narutoe dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 05/09/2011, 08h48
  4. Afficher sous Word des données SQL qui contient des retours
    Par samoht dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 30/09/2005, 16h12
  5. Structure des données en retour d'un DBExtract ?
    Par mikouts dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/01/2003, 15h15

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