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 :

onLoad=setTimeout et ajax


Sujet :

JavaScript

  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut onLoad=setTimeout et ajax
    Bonjour,

    Je viens de créer un petit code sur une page HTML. J'aimerais que cette page appelle une fonction toutes les x secondes.

    Voilà mon body :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onLoad="javascript:setTimeout('getNouveauxTotaux()',2000);">
    J'ai également essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onLoad="window.setTimeout('getNouveauxTotaux()',2000);">
    Cette fonction getNouveauxTotaux fait appele a une fonction d'ajax comme ceci :
    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
    33
    function getNouveauxTotaux()
    {
    	var requete = null;
        try 
    	{
            requete = new XMLHttpRequest();
        } catch (essaimicrosoft) 
    		{
            try {
    			requete = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (autremicrosoft) 
    			{
                try {
    				requete = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (echec) 
    				{
                        requete = null;
    				}
    			}
    		}
     
    	requete.onreadystatechange = function() 
    	{ 
    	if(requete.readyState == 4)
    		{
    			actualiserPage(requete);	
    		}
    	};
     
    	requete.open("GET","GetVenteJSON.php",true); 
    	requete.send(null);
     
    }
    Le code de la fonction actualiserPage() permet de récupérer 2 - 3 variables dans le fichier .php.

    Mon problème est que la fonction du body fonctionne bien .. mais une seule fois ! Alors que c'est censer faire appeller toutes les 2 secondes ici en occurences, il y a un conflit avec l'ajax vous pensez ?

    Je suis obligés de passer par cette fonction onload et settimeout ...

    Merci !

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut
    J'ai honte .. en fait fallait juste que je relance me fonction setTimeOut à la fin de ma fonction actualiserPage()

    Mais le setTimeOut ne suffit pas à lui seul normalement ?

  3. #3
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    c'est setInterval qui fait des appels récurrents, setTimeout ne lance
    qu'un appel.

  4. #4
    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
    Par défaut
    Sinon, tu peux aussi faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(requete.readyState == 4)
    		{
    			actualiserPage(requete);
    			setTimeout(function(){getNouveauxTotaux()},2000);
    		}
    	};
    A+

  5. #5
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Attention au cas où une requête n'aboutit pas (coupure réseau temporaire).
    la requete n'atteindra pas readyState 4 et il faudra rafraichir la page pour relancer le mécanisme.

  6. #6
    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
    Par défaut
    Le readyState sera à 4 mais seulement le status ne sera pas à 200.

  7. #7
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Je ne pense pas non, le readystate est fixé à 4 quand une réponse
    revient du serveur. Si le serveur réponds pas du tout je doute fort
    que cela soit le cas.

    EDIT: Voici une gestion de timeout ici

  8. #8
    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
    Par défaut
    Citation Envoyé par marcha Voir le message
    Je ne pense pas non, le readystate est fixé à 4 quand une réponse
    revient du serveur. Si le serveur réponds pas du tout je doute fort
    que cela soit le cas.
    Je viens de faire un test, le readystate passe à 4 mais c'est le status qui n'est pas à 200.

    EDIT: 200 mais pas 400

  9. #9
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Peux tu détailler ton test que je reproduise stp ?

  10. #10
    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
    Par défaut


    Premier test,

    J'ai créé un fichier php avec quelque echo et un sleep pour faire un peu durée la requête, pendant l’exécution du fichier php suite à la requête Ajax, j'arrête apache au bon milieu. le readyState passe à 4 après quelque temps mais le status n'est pas à 200.

    Deuxième test,
    J'appelle tous simplement un hote qui n'existe pas, au bout de certains temps, le readyState passe à 4 mais le status n'est pas à 200.

    A+.

  11. #11
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Merci, tu peux poster le code que je test chez moi ?

  12. #12
    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
    Par défaut


    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 testAjax()
    {
       var xhr=createXHR();
       xhr.open("POST", "page.php",true);
       xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
       xhr.onreadystatechange = function()
       {
          if(xhr.readyState == 4)
          {
             if(xhr.status == 200)
             {
                alert(xhr.responseText);
             }
             else
             {
                alert("Erreur: " + xhr.status);
             }
          }
       }
       var valeur = select.options[select.selectedIndex].value;
       var variable = 'variable=variable';
       xhr.send(variable);
    }
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    echo $_POST["variable"]."\n";
    echo $_POST["variable"]."\n";
    sleep(60);// en secondes
    echo $_POST["variable"]."\n";
    echo $_POST["variable"]."\n";
    ?>

    A+.

  13. #13
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    Merci pour ton code je viens de m'amuser à tester ce que tu as fais
    et j'observe en effet que lorsque je kill le process apache ou que je
    stop apache normalement, la requête abouti à un ready state 4 et
    le contenu partiel avant le sleep est affiché.

    Cependant d'une point de vue TCP/IP (sans être un spécialiste) ce n'est
    pas pareil à une coupure réseau. On a une connexion fermée ou qqch
    comme ça.

    Je te propose de faire le test suivant depuis chez toi:

    1) tu lance ta requête ajax sur ton code php (toujours avec sleep 60)
    2) tu attends 5 secondes environ
    3) tu retire le câble réseau de ton PC
    4) tu attends 2 minutes
    5) tu le rebranche

    Et là, on passe pas en ready state 4, c'est "pending" depuis 15 minutes
    chez moi, je vais voir si j'ai la patience d'attendre encore

    C'est pour palier à ce cas de figure que je proposais d'utiliser setInterval
    au lieu de setTimeout.

    Cependant ma proposition risque d'induire un autre problème:

    Le nombre de requêtes xhr simultanées vers un même serveur est limité
    par le navigateur (par exemple pour FireFox voir la note en jaune)

    Donc si le réseau a plusieurs coupures on risque d'arriver à cette limite
    en rouvrant des requêtes avec setInterval.

    Qu'en pensez-vous ?

  14. #14
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    J'ai eu un ready state 4 après env. 45 minutes sur FireFox avec un status = 0
    prévois de faire ton test avant le souper :-)

  15. #15
    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
    Par défaut
    Citation Envoyé par marcha Voir le message
    Donc si le réseau a plusieurs coupures on risque d'arriver à cette limite
    en rouvrant des requêtes avec setInterval.

    Qu'en pensez-vous ?
    En déclarant des variables globales
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    b = setTimeout(function(){requete.abord(); if(a!=null) clearInterval(a);getNouveauxTotaux() }, 120000);
    if(requete.readyState == 4 ){
    		if (requete.status==200){
    			actualiserPage(requete);
    		}
    		if(a!=null) clearInterval(a);
    		a = setTimeout(function(){getNouveauxTotaux(); clearInterval(b)},2000);
    };
    ou bien?
    Je ferai le test quand j'aurai un peu de temps. Merci pour tes résultats.

    A+.

  16. #16
    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
    Par défaut
    Petite correction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a=null;
    b = setTimeout(function(){requete.abord(); if(a!=null) clearTimeout(a);getNouveauxTotaux() }, 120000);
    if(requete.readyState == 4 ){
    		if (requete.status==200){
    			actualiserPage(requete);
    		}
    		if(a!=null) clearInterval(a);
    		a = setTimeout(function(){getNouveauxTotaux(); clearTimeout(b)},2000);
    };
    clearTimeout au lieu de clearInterval et remettre a à null.

    A+.

Discussions similaires

  1. SetTimeout interminable ajax
    Par Anonyme1784 dans le forum jQuery
    Réponses: 11
    Dernier message: 28/06/2015, 19h43
  2. [AJAX] - Rafraichissement d'un DIV avec setTimeOut
    Par Seb06 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/03/2011, 00h07
  3. body onload avec l'ajax
    Par kaking dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 07/10/2008, 16h19
  4. [AJAX] Ajax et <body onload="..">
    Par Invité dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 26/03/2007, 13h06
  5. SendAndLoad, onLoad et setTimeout
    Par imikado dans le forum Flash
    Réponses: 2
    Dernier message: 09/12/2006, 14h45

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