Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajax: Vider le contenu de xhr.responseText

Sujet résolu
    17 mai 2009 à 18:16:51

    Bonjour à tous,

    Voila, j'ai un petit problème dans une de mes application Ajax. Je dois charger en continue des données depuis une requête ajax, la requête n'est donc pas censé se finir tant qu'on ne quitte pas la page.
    Les données sont ainsi traiter pour mettre à jour la page sauf que les nouvelles données reçu s'additionnent à celles déjà enregistre dans xhr.responseText, j'ai donc au bout de plusieurs minute, une chaine énorme à gérer et donc ça lag de plus en plus.
    Xhr.responseText est en lecture seul, et je n'ai pas trouvé le moyen de le remettre à 0. Donc je vous demande si vous ne connaitriez pas une solution miracle pour ma situation que j'aurai zappé qui ne demande pas de refaire une requête ajax.

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2009 à 18:27:10

      Ben au lieu d'utiliser tout le temps le même objet xhr, en créer un pour chaque requête (le top en temps que variable locale d'une fonction histoire que le xhr précédent soit détruit à la fin de l'exécution de la fonction, donc on nettoie un peu la mémoire)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 mai 2009 à 18:27:42

        Tu fait un truc qui ressemble à «comet» ? Quel genre de données tu as ? surtout quel genre de traitement tu fais sur ta réponse ?

        A froid comme ça je ne sais pas.
        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2009 à 18:33:55

          k1rby: justement, j'ai demande s'il y avait un moyen d'effacer les ancienne donné sans refaire de requete, de plus ce n'est pas mon seul objet xhr, j'en ai 6.

          nod_: Je ne connais pas "comet", les données reçus sont des chaines de caractère que je parse par la suite.
          De toute façon l'application que j'en fait n'est pas importante en soit, je cherche juste un moyen de vider l'objet.
          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2009 à 18:45:27

            Tu es sûr que c'est xhr.responseText qui "cumule" ? fait un alert(xhr.responseText) pour vérifier que c'est bien lui le problème
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              17 mai 2009 à 18:47:31

              De ce que je vois, faut que tu crée un nouvel objet pour virer ce que t'as déjà récupéré (dans le cas ou les données s'accumulent effectivement, j'en sais rien je bosse pas assez avec xmlhttprequest).

              Ensuite pour pouvoir t'aider d'une façon optimale, puisque aparement il n'y a pas la solution que tu espère on a besoin de connaitre les données du problème. D'où ma demande de détails sur les traitements que tu effectues sur ta chaine :)
              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2009 à 19:15:26

                Oui K1rby, j'affiche le tout avec un alert();

                nod_: C'est pour gérer un déplacement en temps réel des personnage sur une carte, chaque client se connecte à mon serveur en C qui récupère les requête que je lance avec ajax. Et donc par intervalle de temps régulier, les position de chaque joueur sont renvoyé avec comme donnée l'id du joueur, sa position sur x et y, quand je reçois les informations, je remplace
                document.getElementById(idjoueur).style.left
                document.getElementById(idjoueur).style.top
                avec les valeur de x et y.
                Mais voila, au bout de quelque minute, mon objet contient plusieurs millier de ligne.
                Donc j'aimerai que xhr.responseText soit reset à chaque traitement car sinon à chaque fois je dois sauter de plus en plus de ligne pour atteindre la plus récente et donc ce n'est plus du tout fluide.
                J'avais penser refaire la requete ajax a chaque fois, mais c'est un bouffe bande passante de devoir tout le temps gerer les nouvelles requete de chaque joueur, j'en ai déja assez avec les autre action. Donc une seul et unique requete pour rafraichir la position des joueur sur toute la durée du jeu serai désirable :).
                Après recherche google, oui c'est bien le principe comet que je veux.

                Pour l'instant, à part un SetTimeOut sur ma fonction qui se charge de faire les requete ajax, j'ai rien de mieux.
                • Partager sur Facebook
                • Partager sur Twitter
                  19 mai 2009 à 9:32:14

                  :euh: faire un :
                  nouvellevaleur = xhr.responseText;
                  à la place de :
                  nouvellevaleur += xhr.responseText; ?
                  ça expliquerait l'ajout à la suite :-°
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 juin 2009 à 13:08:12

                    Salut
                    je développe un serveur comet en java, et j'ai exactement le même problème.
                    C'est clairement un désavantage face au long-polling je pense.
                    J'aimerai savoir si tu as trouvé une solution pour ton problème ?

                    Voila un petit exemple d'une application que j'ai faite avec :
                    http://avricot.com/blog/index.php?cate [...] ojet/AvriChat
                    Je met un console.log() pour que vous puissiez voir l'accumulation des infos.
                    (bon je vais reduire la taille des ordres à 1 lettre (plutot que "action" => "a" par ex) pour gagner un peut mais clairement au bout d'un certain temps ca va saturer.
                    J'ai optimisé au maximum en ne parsant que les derniers objets JSON mais j'accède quand même à chaque fois à la chaine qui grandi de plus en plus pour récupérer les derniers événements...
                    Si quelqu'un a une idée...
                    Moi j'avoue que je sèche là !
                    La seul solution que je vois serait d'effacer l'objet et de relancer une connexion, et d'arranger pour que le serveur détecte la reconnexion et adapte tout.
                    Bon c'est possible, il n'y a pas de pb particulier, mais une solution js serait peut être meilleur...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      5 juin 2009 à 13:36:02

                      yop, t'as pas 36 solutions en fait :

                      mozilla only : envoyer tes données avec un header Content-type: multipart/x-mixed-replace. À chaque fois que des nouvelles données sont envoyés par le serveur, responseText se vide.

                      Pour tous les browsers : Mettre un setInterval qui tue et relance la requete périodiquement. Pas de solution miracle, j'suis allé vérifier :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juin 2009 à 14:38:54

                        Ok merci je vais tester ca.
                        De toute facon avec ie ca ne marche pas comme ca, il faut faire avec des iframs chargés par un objet activeX pour ne pas avoir de click et tt, c'est un peu galère.
                        Reste à voir ce que ca dit avec webkit :)
                        Je vous tiens au courant ^^

                        PS : bon pour l'instant ca marche pas, apparement faut séparer les parties avec un boundary=separator, ca avance, ca avance !

                        PPS : bon ca marchotte marchotte : j'arrive a récuperer les 2 premiers pus, après plus rien ne se passe :(

                        PPPS : c'est bon ca marche.
                        J'ai eu du mal à l'adapter à mon framework en fait, mais maintenant c'est ok.
                        Si qqun est interessé pour le faire avec Request de mootools je peux lui montrer les modifs.
                        Voila la solution coté js en gros :
                        this.comet = new XMLHttpRequest();
                        			this.comet.multipart	= true;		
                        			this.comet.open( 'GET', this.options.urlServer+'?action=login&name='+this.name+'&pass='+_pass+this.options.defaultChannel, true );
                        			this.comet.onload = function (event) {
                        				if (event.target.readyState == 4 ) {
                        					console.log( 'Data arrives: ' + event.target.responseText );
                        				}
                        				else {
                        					console.log( 'an error occured: ' + event.target.readyState );
                        				}
                        			};
                        			this.comet.send(''); */
                        


                        Et ce que doit envoyer le serveur :

                        Citation


                        //header :
                        Content-Type: multipart/x-mixed-replace;boundary=Separator

                        //Contenu :

                        --Separator
                        Content-Type: application/json

                        {"action":"setSession","value":"XFHf0vTEkNqjir0QwqnehYtnF"}

                        --Separator
                        Content-Type: application/json

                        {"action":"joinChannel","value":"general"}

                        --Separator
                        Content-Type: application/json

                        {"action":"setUser","value":"1"}

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Ajax: Vider le contenu de xhr.responseText

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown