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 :

[Javascript] exécution de la fonction setTimout() en boucle


Sujet :

JavaScript

  1. #1
    Membre confirmé Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut [Javascript] exécution de la fonction setTimout() en boucle
    Bonjour,

    J'ai besoin d'ouvrir des pages web en laissant à chaque fois 30s d'écart entre chaque ouverture. Je me suis dit que la meilleure solution serait un retardateur (setTimeout). Seulement ce n'est pas toujours la même page que j'ouvre. J'ai donc dû insérer mon setTimeout dans une boucle for.

    Je vous ajoute une partie de mon code pour une explication plus claire :

    var retardateur ;

    for(i=1; i<=11; i++)
    {
    retardateur = setTimeout(envoi_ip(tab_ip[i-1]), 30000) ;
    }

    clearTimeout(retardateur) ;
    Le problème est que ma boucle ne boucle pas pour je ne sais quelle raison. La fonction du setTimeout s'exécute une fois puis plus rien.

    Quelqu'un a-t'il déjà eu des problèmes en utilisant setTimeout dans une boucle ? Avez-vous des solutions ?

    Merci d'avance,

  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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    setInterval ...
    clearInterval
    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é Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut
    Oui mais avec setInterval(), la page que j'ouvrirai sera toujours la même non ? Cela ne résoudra pas le fait que ma boucle ne boucle pas.

  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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    le problème est que i change alors l'appel est le même c'est a dire la dernière valeur de i et puis tu fais un clearTimeout qui bmloque le tout ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    retardateur = new Array()
    for(i=1; i<=11; i++)
    {
    retardateur.push( setTimeout(envoi_ip(tab_ip[i-1]), 30000) );
    }
    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é Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut
    J'ai essayé cette solution là mais ça ne change rien du tout, ma boucle ne boucle toujours pas ! Je ne comprends pas ce que ça aurait dû changé de mettre le résultat dans le tableau (ça c'est pour ma culture personelle).


  6. #6
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    ben déja ça aurait changé que tu n'auraois pas attribuer une focntin a une même variable ...
    c'est comme si tu faisais:

    var variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(i=0;i<10;i++){variable=i}
    alert (variable)
    l'alerte te retournerait toujours 9 !!!

    essaye ça alors ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    retardateur = new Array()
    for(i=1; i<12; i++)
    {
    this.lien=i-1
    retardateur.push( setTimeout(envoi_ip(tab_ip[this.lien]), 30000) );
    }
    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 !

  7. #7
    Membre confirmé Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut
    Je ne pense pas que ce bout de code puisse me servir à grand chose. J'ai fait des test avec des alert et ça ne marche pas non plus. Je me demande si setTimeout peut vraiment être utilisé dans une boucle...

    Est-ce qu'il y aurait une autre méthode que setTimeout() et setInterval() ?

    retardateur = new Array() ;

    for(i=1; i<=11; i++)
    {
    retardateur.push(setTimeout(alert("ok"), 3000)) ;
    }

    clearTimeout(retardateur) ;

  8. #8
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    une boucle infinie avec recuperation de la date systeme tu compare le temps ecoule ... Et quand c est le cas --> break;

  9. #9
    Membre Expert
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Par défaut
    clearTimeout(retardateur) ;
    si tu ne détruis pas avant l'exécution ce sera mieux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var i=0 ;
    retardateur = setInterval(function(){envoi_ip(tab_ip[i]);i++;if(i>10)clearInterval(retardateur); }, 30000) ;
    }

  10. #10
    Membre confirmé Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut
    Je n'ai pas trop compris ce que faisait ce petit bout de code.

    J'ai plus ou moins abandonné setTimeout() pr essayer de comparer 2 dates jusqu'à ce que l'écart entre elles soit de 30s.

    Quelqu'un connait-il une fonction qui permet de récupérer la date du moment ?

    Merci !

  11. #11
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    le souci dans la boucle est sur l'indice de i ...
    c'est la le seul problème (à part le fait bien sur de killer le timeout )
    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 !

  12. #12
    Membre Expert
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Par défaut
    Citation Envoyé par mullger
    Quelqu'un connait-il une fonction qui permet de récupérer la date du moment ?

  13. #13
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    voici la reponse à ton problème avec un timeout :
    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
    <script type='text/javascript'>
    var retardateur = new Array() ;
    var indice = new Array()
    var j
    function foo(){j=0;
    				for(i=1; i<12; i++){indice[indice.length-1]=i;
     
    				   						retardateur[retardateur.length-1]= setTimeout( function(){ j++;
    				   											document.getElementById('result').innerHTML+=j+"<br/>"}
    				    																					 ,1000*indice[indice.length-1])
    											}
     
    				}
     
     
    </script>
    </head>
     
    <body onload="foo()" >
    <div id='result'></div>
    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 !

  14. #14
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function setTimeoutFunction() {
      var i = setTimeoutFunction.i;
      // ...
      setTimeoutFunction.i++;
      setTimeout(setTimeoutFunction, 1000)
    }
    setTimeoutFunction.i = 0
    setTimeout(setTimeoutFunction)
    ?

  15. #15
    Membre confirmé Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut
    Merci pour les multiples solutions proposées, je crois que je vais rester sur la solution de comparer 2 dates car mon niveau en javascript n'est pas assez bon pour comprendre tt ce que vous faites dans vos codes.

    Concernant la fonction permettant d'affecter la date system à mon objet Date, je voudrais faire l'équivalent de :

    var nomVariable = new Date() ;
    sauf après la déclaration de manière à mettre la date system de mon objet à jour en quelque sorte.

    Est-ce qu'il y a une fonction pour affecter la date system à mon objet ? Par exemble si je fais un setSeconds() (sans paramètres), est-ce que ça affectera le nombre de secondes du system ?

    Merci d'avance,

  16. #16
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    le fait d'attribuer new Date() à une variabvle la remets à jour ...
    la prueve ici un décallage de 3 secondes entre les deux dates ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Date1 
    var Date2
     
    Date1= new Date() ;
    SetTimeout(function(){Date2=new Date();
                                    alert(Date1 + " => " + Date2);},3000)
    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 !

  17. #17
    Membre confirmé Avatar de mullger
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 157
    Par défaut
    Merci, je viens de tester et ça fonctionne !

    Seulement l'exécution de mon script dure 6x 30s et firefox me la bloque en me demandant d'arrêter le script. Connaissez-vous un remède à ce problème ?

    Merci !!!

Discussions similaires

  1. HttpClient - Exécution d'une fonction JavaScript
    Par Vakhyw dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 20/05/2008, 08h08
  2. Exécution d'une fonction javascript
    Par NicolasR dans le forum ASP.NET
    Réponses: 3
    Dernier message: 21/04/2008, 16h20
  3. Exécution d'une fonction ruby/rails à partir de javascript
    Par pjmorce dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 27/02/2008, 10h35
  4. [curseur] modification curseur pdt exécution d'une fonction javascript
    Par NikoBe dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 04/04/2007, 19h31
  5. Réponses: 3
    Dernier message: 03/01/2007, 21h43

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