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 :

Succession de messages après un setTimeout


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Succession de messages après un setTimeout
    Bonjour à tous,
    Je ne suis pas développeur, et je n'ai pas suivi de formation d'un quelconque codage... Autant vous dire que je pars de loin
    Récemment, j'ai voulu créer un bot pour mon serveur Discord afin de répondre à un besoin personnel, et autant dire qu'en suivant un tutoriel déjà tout fait, le travail m'a été bien mâché...
    Mais voilà, le problème survient lorsque de nouvelles idées me font un peu toucher au code, et n'y connaissant pas grand chose, y mettre la main à la pâte s'avère vraiment compliqué

    Pour faire simple, j'aimerai que lorsque mon bot reçoit un message spécifique (par exemple ici !hello pour le test), mon bot me renvoie avec des intervalles différentes une liste de messages.
    J'ai trouvé un petit bout de code ressemblant à ça:
    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
    function fonctionAEtape(etape) {
     switch(etape)
                {
                    case 1 :
                    bot.channels.get("464460220928753676").send("test 1");
                         setTimeout("fonctionAEtape(2)",5000);
                         break;
     
                    case 2 :
                    bot.channels.get("464460220928753676").send("test2");
                         setTimeout("fonctionAEtape(3)",3000);
                         break;
     
                      case 3 :
                      bot.channels.get("464460220928753676").send("Bienvenue ");
                         break;
              }
               }
    mais voilà je ne sais pas du tout comment l'implémenter dans mon code de base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bot.on('message', message => {
        if(message.content[0] === PREFIX) {
            if(message.content === "!hello")
    Pour l'instant j'ai tenté ça, mais ça ne marche absolument pas

    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
    (function fonctionAEtape(etape) {
    bot.on('message', message => {
        if(message.content[0] === PREFIX) {
            if(message.content === "!hello")
     
                switch(etape)
                {
                    case 1 :
                    bot.channels.get("464460220928753676").send("test 1");
                         setTimeout("fonctionAEtape(2)",5000);
                         break;
     
                    case 2 :
                    bot.channels.get("464460220928753676").send("test2");
                         setTimeout("fonctionAEtape(3)",3000);
                         break;
     
                      case 3 :
                      bot.channels.get("464460220928753676").send("Bienvenue ");
                         break;
              }
               }
                })
        }
    );
    - Quelqu'un aurait-il l'obligeance de m'expliquer comment intégrer cette fonction? (je comprendrai mieux que sur les sites que j'ai visité)
    - Est-il possible de carrément pouvoir envoyer des messages à des heures précises qui différent chaque jour mais qui se répètent chaque semaine?

    Merci d'avance de vos réponses

  2. #2
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    Tu utilise mal la fonction setTimeout

    tout est dans la doc => https://developer.mozilla.org/fr/doc...ope/setTimeout
    var identifiant = scope.setTimeout(fonction[, delai, param1, param2, ...]);cad: le nom de la fonction a exécuter ne doit pas être mis entre quotte, et les paramètres éventuels doivent être placés après la valeur du délai.

    donc par exemple pour la ligne 6 de ta première section de code au lieu d'écrire

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
     setTimeout("fonctionAEtape(2)",5000);

    se code correctement de la façon suivante :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
     setTimeout( fonctionAEtape , 5000, 2 );

    le reste j'ai pas tout regardé mais ta 3eme section produira un pantage, parce que tu a placé une récursion avec le setTimeout.

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function fonctionAEtape(etape) {
    //..//
         setTimeout( fonctionAEtape ,5000, 2)

    Pour répéter un appel de fonction il faut utiliser la fonction setInterval https://developer.mozilla.org/fr/doc...rs/setInterval

    et clearInterval https://developer.mozilla.org/fr/doc.../clearInterval pour l’arrêter.
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Salut, si j'ai bien compris je ne peux pas utiliser deux setTimeout dans une même fonction, sans d'abord passer par un setInterval et un clearInterval entre chaque? Pourtant j'appelle mon setTimeout dans des cases différentes, non?
    A ce que je vois, d'après la référence
    delai est le nombre de millisecondes (millièmes de seconde) que setInterval() doit attendre avant chaque appel de fonction
    mais moi mon appel de fonctions diffère à chaque fois, un coup c'est 5 secondes, un coup 8...
    Après je ne suis pas sûr que j'ai le droit d'écrire ma fonction entre parenthèse comme ça, j'ai mis une ligne témoin afin de vérifier que l'écriture de la fonction marche correctement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (function fonctionAEtape() {
    bot.on('message', message => {
        if(message.content[0] === PREFIX) 
            if(message.content === "!hello")
            console.log("C'est ok")
               })
            });
    Et effectivement la console ne me renvoie absolument rien .
    J'ai pensé à passer par une variable, mais c'est possible d'associer une fonction à une variable, du genre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = fonctionAEtape(etape)

  4. #4
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    si j'ai bien compris je ne peux pas utiliser deux setTimeout dans une même fonction
    comme je te l'ai écrit ce que tu a fait s'appelle une récursion => https://fr.wikipedia.org/wiki/Algorithme_r%C3%A9cursif, il y a unrisque de plantage, peut être pas sur les 10 premiers ou les 100 premiers cycles, mais peut être aussi au bout de 3 cycles, parceque sa pile d'appels peut être déjà pleine.

    mais moi mon appel de fonctions diffère à chaque fois, un coup c'est 5 secondes, un coup 8...
    la fonction setTimeout, comme son nom l'indique met suspend l’exécution d'une fonction suivant le délai indiqué.
    mettons 5 minutes => l'interpréteur place en mémoire un compteur sur le délai, et ce compteur il le met à jour quand il peut, si entre temps il doit traiter une grosse fonction qui dure une heure, ,il ne se préocuppe pas de vérifier si une fonction était en attente. ( bon exagére énormément, mais l'idée est la , les 5 minutes sont pour lui juste une indication du temps minimal à attendre.

    Après je ne suis pas sûr que j'ai le droit d'écrire ma fonction entre parenthèse comme ça
    Oui tu a le droit, et l'interpréteur fait un éval de ce que tu a mis entre quottes et ça lui prend un peu plus de temps.
    Tu a aussi le droit d'utiliser correctement la syntaxe de JavaScript

    J'ai pensé à passer par une variable, mais c'est possible d'associer une fonction à une variable, du genre ?
    Compte pas sur moi pour entrer sur un discours philosophique sur comment on pouurai changer la syntaxe d'un langage pour te faire plaisir
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

Discussions similaires

  1. Message après demarrage du PC
    Par vacknov dans le forum Windows Vista
    Réponses: 0
    Dernier message: 31/12/2007, 17h10
  2. [MySQL] Message après exécution d'une requête
    Par Alex70 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/09/2007, 14h41
  3. Comment sauvegarder un message après l'envoi
    Par bassbaki dans le forum JSF
    Réponses: 2
    Dernier message: 12/06/2007, 17h15
  4. [VBA-E] Eviter l'affichage de certains messages après un copier/coller
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/03/2007, 18h13
  5. Message après "copy"
    Par licorne dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2005, 09h34

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