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] Abort sur une onreadystatechange


Sujet :

AJAX

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    exact
    c'est déjà lancer depuis 1h presque avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    XhrObj.onreadystatechange = function()
    {
       if (XhrObj.readyState == 4 && XhrObj.status == 200) {
          content.innerHTML="yep";
       }
       else{
          content.innerHTML="Cb Error";
       }
    }
    je vous tiens au courant
    mon titre n'est peut-être pas top ... je suis d'accord

  2. #22
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    Citation Envoyé par Regis0122 Voir le message
    Mais alors comment vous expliquez que tout à coup y'a plus rien dans mon_div ??
    Comme déjà dit plus haut, je crains que la principale erreur soit de vouloir utiliser Ajax pour lancer ce traitement serveur.
    le contenu du div se vide (peut-être) au moment où le serveur commence à générer la réponse (en gros au 1° "echo").
    Or la réponse complète ne sera écrite dans le div qu'une fois le traitement serveur terminé. Mais celui-ci semble un peu trop long pour les timeout habituellement utilisés.
    le div s'est vidé car il commençait à recevoir un nouveau contenu, mais il ne reçoit jamais le signal de "fin du contenu" donc l'affichage n'est pas mis à jour.
    Y a pas une histoire de flush() en PHP (de mémoire, car je n'utilise pas PHP) qu'il serait possible d'utiliser à des étapes intermédiaires, pour forcer l'envoi de la réponse au fur et à mesure ?

    Citation Envoyé par Regis0122 Voir le message
    mon titre n'est peut-être pas top ... je suis d'accord
    Pas HS en tous cas : va visiblement falloir que tu le prévois, le

    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  3. #23
    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 Regis0122 Voir le message
    exact
    c'est déjà lancer depuis 1h presque avec ça
    C'est différent du script que je t'ai proposé, toi tu vérifies à la fois readyState et status or que le mien vérifie le status après le retour ajax soit prêt.
    Regarde ici.

    A+.

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

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par Regis0122 Voir le message
    tu abandonnes bien vite Romain et puis, si je n'en dis pas plus c'est parce que je voulais que le problème soit épuré ... pour ne pas être trop compliqué à lire, je ne cache rien.
    Alors je vais compléter un peu, ... <explications techniques sans aucun intérêt POUR LE MOMENT>
    ... car en effet tu détailles de plus en plus le "COMMENT", mais malheureusement nous ne savons toujours pas "POURQUOI" tu veux faire tout ça (je vous jure que je suis vachement calme lachez moi je ne veux pas monter dans l'ambul... aaaaaaaah *PAF*)

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    Romain ... ce que je faire ??? ... la réponse est simple petit curieux, je veux un code sans bug

    Oui andry.aime ton code n'est pas exactement le même que le mien, mais avec mon code, j'ai eu un "yep". Ce petit test m'a parmis aussi de constater que l'index.php tourne toujours .....

    le contenu du div se vide (peut-être) au moment où le serveur commence à générer la réponse (en gros au 1° "echo").
    Or la réponse complète ne sera écrite dans le div qu'une fois le traitement serveur terminé. Mais celui-ci semble un peu trop long pour les timeout habituellement utilisés.
    Non, il n'y a aucun "echo" appelé dans l'index.php car je suis toujours dans ma boucle de lecture socket ... je le sais car j'ai mis une écriture en base de donnée et celle-ci continue d'être écrite ...

    le div s'est vidé car il commençait à recevoir un nouveau contenu, mais il ne reçoit jamais le signal de "fin du contenu" donc l'affichage n'est pas mis à jour.
    Comme je le disais nous sommes toujours dans la boucle de lecture socket ... donc on envoie rien ...

    Je pense que mon feeling de départ se vérifie de plus en plus. La fonction onreadystatechange est appelé au bout d'un certain temps ... avec rien dans le responseText est donc on affiche rien du tout.

    Mais pourquoi ?????????
    Et pourquoi devrais-je passer par un XhrObj.abort(); sachant que je ne souhaite surtout pas abandonner ma requete ... bien au contraire ??

  6. #26
    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
    As tu essayé le dernier code que je t'ai proposé à la place du tien.

    A+.

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    ben, je voulais le faire, mais sachant que j'ai eu le yep, c'est que les 2 conditions sont vrais, je me trompe ?

  8. #28
    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 Regis0122 Voir le message
    ben, je voulais le faire, mais sachant que j'ai eu le yep, c'est que les 2 conditions sont vrais, je me trompe ?
    Les conditions 2 conditions sont vraie dans ce cas, mais tu es sûr que l'exécution du fichier index est terminé jusqu'à la fin?

    Utilise une variable session que tu modifies sa valeur à la fin du script qui dure 4h, tu lances ce script à partir d'une requête AJAX. Tu lances ensuite un autre script AJAX qui va appeler une autre page php qui vérifie la valeur de la variable session à chaque intervalle de temps en utilisant setInterval.

    A+.

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    ben non, je reste toujours dans mon index.php (donc toujours pas à la fin), je n'en sors pas, et je fais la même chose que la SESSION mais en écrivant directement dans la base de données, donc je pense que je vois bien ce qui se passe en temps réel, c'est pareil non ? et je constate que je suis toujours dans ma boucle de lecture de socket ... alors que le "yep" a été affiché !!! strange non ?

  10. #30
    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 Regis0122 Voir le message
    strange non ?
    ce que je trouve encore plus strange c'est quelqu'un attendre 4 ou 5h sur une même page.

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    rassure-toi, personne n'attend, celui-ci part se coucher et regarde la réponse le lendemain matin

    En attendant ... je manque d'idée et je suis coincé !!! car je crois qu'on constate bien que la fonction de callback onreadystatechange est appelé au bout d'un certain temps sans que je comprenne pourquoi ???

  12. #32
    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
    Je ne vois pas l'utilité d'Ajax dans ce cas, pourquoi ne pas charger totalement la page

  13. #33
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    Parce qu'il n'est peut-être pas parti se coucher hihi

    Visiblement l'ajax n'est pas la solution puisque j'ai un problème avec la callback ... mais depuis que mes tests sont plus long, je suis confronté à ce problème. Cela dit, avant ce souci, ça marchait vraiment bien ... donc c'est pour cette raison que j'aimerai trouver la solution et éviter d'avoir tout à refaire ... ce qui me prendrait beaucoup de temps

    Je suis en train de le faire tourner avec google chrone pour voir si ce n'est pas une limitation à Mozilla, qu'en pensez-vous ?

  14. #34
    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
    Sincèrement, même si je n'intervient pas dans la discussion, je la suis malgré tout et comme les autres, je pense que ton problème vient essentiellement du fait que tu utilises AJAX dans un contexte pour lequel il n'est pas fait.
    C'est vrai que IE8 a prévu une notion de timeout pour les requêtes afin de gérer entre autre ce genre de cas, mais je ne suis pas sûr que pour les autres utilisateurs, l'objet XMLHttpRequest coupe lui-même une connexion trop longue en renvoyant des résultats non cohérents.

    Je pense que dans ton cas, tu ferais mieux de te pencher sur une solution serveur à base de push.
    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. #35
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    merci bovino pour ton attention.
    je suis de plus en plus convaincu moi aussi que l'ajax n'est pas la bonne solution ... mais l'architecture est basée sur ce principe, pour l'instant je n'ai pas le temps de la modifier, il faut que ça marche comme ça alors j'ai ajouté le setTimeout conseillé depuis des lustres par andry.aime et je fais tourner ça sur google chrone ... en cours ...

    Je ne connais pas la méthode push ? tu peux m'en dire un peu plus ? il faut que mon client s'abonne (en 2 mots)

  16. #36
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bonsoir Regis,

    Citation Envoyé par Regis0122 Voir le message
    lorsque mon index.php est appelé, j'ouvre une socket non-bloquante, et j'envoie des commandes via la socket. Une boucle lit régulièrement les réponses de la sockets (c'est un listener), et lorsque que celle-ci reçoit une chaine bien spécifique, alors celle-ci se ferme et ainsi la réponse est écrite dans mon_div.
    Ce que fait ton serveur avec sa socket, ça le regarde. Mais une connexion HTTP, ça doit être court : ça se compte en millisecondes. D’une part, pour ne pas surcharger le réseau ni le serveur HTTP, d’autre part parce que plus ça dure longtemps, plus il y a risque de panne.

    Ensuite, tu ne peux pas faire d’hypothèses sur le navigateur du client, et si ton serveur est configuré pour tenir une connexion sans limite, en revanche tu ne sais pas si ça ne va pas couper à l’autre bout.

    Donc je plussoie Bovino qui te propose de revoir ta conception, même si je ne connais pas la méthode PUSH (je suppose que le serveur, au moment voulu, rouvre une connexion vers le client).
    Sinon il y a une solution Ajax facile à mettre en œuvre : tu te fais un script serveur chargé d’informer le client, quand celui-ci le demande, de l’avancement de l’opération ; le client fait une requête Ajax vers ce script à intervalles réguliers (mettons 1 min). C’est ce qui est utilisé par Gmail pour vérifier l’arrivée de nouveaux mails.

    Dernière remarque : si tu n’as pas Firebug, installe-le sans plus attendre ! Si tu l’as, regarde l’onglet réseau, tu y trouveras des merveilles : il te permet de surveiller les communications avec le serveur, sans avoir aucun bout de code à taper. Et ça vaut pour les consoles de Chrome et Opera également.

    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  17. #37
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 153
    Points : 56
    Points
    56
    Par défaut
    Salut à vous tous et merci pour ta partiticipation Watilin

    J'ai bien conscience désormais que l'ajax n'était pas la bonne solution pour ça. si j'ai du temps, je passerai par la solution push conseillée par Bovino, mais pour l'instant, il me fallait une solution.

    Pour contourner mon pb de abort sur la callback, j'ai donc tout simplement créé ma propre fonction que j'appelle récursivement par un setTimeout. Cette fonction lit le contenu d'un cookie et lorsque celui-ci vaut une certain valeur, alors, j'exit la fonction.
    C'est un peu du bidouillage, j'en conviens ... mais c'est la solution qui me permet de rendre mon code fonctionnelle dans un premier temps

    Tu as raison Watilin, il faut que j'utilise Firebug

    Un grand merci à vous tous pour votre coup de main, c'est super sympa

    Regis

  18. #38
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Bonjour à tous,

    J'ai un problème qui correspond exactement à l'intitulé de ce post mais pas à ce qui y est décrit. Je m'explique :
    J'ai une fonction AJAX que je lance à partir d'un body onload.
    Donc ma page s'affiche, j'ai un petit gif qui tourne pour demander de patienter le temps du traitement et tout.
    Le problème c'est que même si je clique sur un lien avant l'affichage du résultat de la fonction AJAX, il ne se passe rien et il faut attendre la fin du traitement (60 secondes en moyenne), et c'est à ce moment là qu'il recharge la page et donc lance le traitement pour lequel je viens de cliquer sur le lien.
    Ce que je voudrais donc, c'est faire un abort du traitement ajax en cours quand je clique sur un lien.
    Est-ce possible ? Comment m'y prendre ? J'avais pensé à mettre une espèce de variable system du genre (attention, c'est du conceptuel )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(window._webRequests) xhr.abord();
    Mais je vois pas du tout où le mettre dans ma fonction.

    J'espère avoir été claire. Si vous voulez des morceaux de code, n'hésitez pas à me demander.

    Merci

  19. #39
    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,

    Citation Envoyé par FireCracker
    Le problème c'est que même si je clique sur un lien avant l'affichage du résultat de la fonction AJAX, il ne se passe rien et il faut attendre la fin du traitement (60 secondes en moyenne)
    Ma boule de cristal me dit que tu travailles en mode synchrone. Si tu veux me contredire, montre nous ton code .

    A+.

  20. #40
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Ok ça marche.
    Ici le code php qui contient le conteneur (ou récepteur) du résultat du traitement (le code autour n'a que peu d'interêt).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo "<div class='s100' id='res_container68'><img src='img/loading9.gif'><BR>Chargement en cours<BR>Merci de patienter...</div>";
    echo "<body onload=\"ajax_outil(68"; if(isset($_GET['tri'])) echo ",".$_GET['tri']; echo ");\">";
    Ensuite le code de la fonction Ajax qui va lancer le traitement :

    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
     
    function ajax_outil(cd_origine, argument)
    {
    	var xhr=null;
    	if (window.XMLHttpRequest) {xhr = new XMLHttpRequest();} 
    	else if (window.ActiveXObject){xhr = new ActiveXObject("Microsoft.XMLHTTP");}
    	xhr.onreadystatechange = function() 
    	{ 
    		if (xhr.readyState==4) 
    		{
    			var docText= xhr.responseText;
    			document.getElementById("res_container"+cd_origine).innerHTML=docText;
    		}
    	};
    	xhr.open("GET", "cod_ajaxoutil.php?tp="+cd_origine+"&arg="+argument, true);
    	xhr.send(null);
    }
    Et enfin le traitement, comme vous pouvez le voir dans le code, est un appel à une page php et on renvoi le résultat dans le div qui s'appelle "res_container68".

    Merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/05/2009, 09h59
  2. [AJAX] zoom sur une image + déplacement
    Par yann.morineau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/02/2009, 09h41
  3. [AJAX] requete sur une page php
    Par xokami35x dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 20/11/2008, 20h35
  4. [AJAX] Rafraîchissement automatique sur une liste déroulante
    Par frutix dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/04/2007, 16h09
  5. [AJAX] Avoir des infos sur une page web
    Par Skieur38 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/03/2007, 21h38

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