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 :

Créer un array de command queues


Sujet :

JavaScript

  1. #1
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut Créer un array de command queues
    Bonjour, je suis tombe sur un concept que je trouve genial, mais que j'ai du mal a implementer (code simple/concis)
    un service va commencer par initialiser un tableau qui stockera les commandes a executer quand le script principal sera telecharge
    par exemple monService = monService || {cmd:[] } ainsi, on peux ajouter ce qu'on veut : monService.cmd.push(() => { console.log('ok'); });.
    et quand monService sera telecharge, il executera tout ce qu'il y aura dans monService.cmd.

    jusque la ca va, mais meme apres telechargement du service, on pourra toujours faire monService.cmd.push(() => console.log('re'); }); et celui-ci sera quand meme execute

    comment implementeriez-vous ca : un setInterval degeux qui verifie le contenu de monService.cmd ?
    un observer sur l'array ?
    autre ?

    les solutions que je trouve sur internet me semblent completement dysproportionnes par rapport au probleme
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    8 362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 8 362
    Points : 12 978
    Points
    12 978
    Par défaut
    Citation Envoyé par Doksuri Voir le message
    quand le script principal sera telecharge
    vous parlez du moment où le script est téléchargé par le navigateur ?

    Citation Envoyé par Doksuri Voir le message
    on pourra toujours faire
    qui est ce "on" ?

  3. #3
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut
    Citation Envoyé par mathieu Voir le message
    vous parlez du moment où le script est téléchargé par le navigateur ?
    => oui

    en gros, dans l'ordre chronologique, ca ferait ca :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    monService.cmd.push(() => { console.log('1'); });
    monService.cmd.push(() => { console.log('2'); });
    <script src="monService.js"></script>
    /* monService.js execute tout ce qu'il y a dans monService.cmd (1 & 2) */
    monService.cmd.push(() => { console.log('3'); });
    /* monservice.js execute la nouvelle commande (3)*/
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    8 362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 8 362
    Points : 12 978
    Points
    12 978
    Par défaut
    et qu'est ce que vous souhaitez obtenir comme résultat ?

  5. #5
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut
    bah, ce que j'ai explique dans mon dernier message : la chronologie

    pouvoir ajouter des commande avant & apres qu'un script soit telecharger, mais sans passer par un timeout degeu, ni par une solutions spagetti

    voici ce que j'essaye de faire (j'ai volontairement mis un long timeout que vous puissiez comrendre comment ca fonctionne)
    Code javascript : 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
    monService = monService || {cmd:[]};
    monService.cmd.push(() => { console.log('before 1'); });
    monService.cmd.push(() => { console.log('before 2'); });
    /* simulation fin telechargement monService.js */
    var monService = {
        cmd:monService.cmd || [],
        checkQueue:function() {
            for(let i=0; i<this.cmd.length; ++i) {
                this.cmd[0]();
                this.cmd.shift();
            }
        },
        init:function() {
            monServiceLoop = setInterval(() => {
                this.checkQueue();
            }, 1E3);
        }
    };
    monService.init();
    /* fin monService.js */
     
    /* continuite de mon code */
    monService.cmd.push(() => { console.log('after 1'); });
    monService.cmd.push(() => { console.log('after 2'); });
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    15 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 15 488
    Points : 38 896
    Points
    38 896
    Par défaut
    Bonjour,
    j'aurais mis une méthode add plutôt qu'un push direct.

    Quand est-ce que les « cmd » sont exécutées,
    • une fois initialisée ;
    • exécutée qu'une que fois toutes sont initialisées ;
    • après que celles en cours sont terminées.


    Pour moi elles exécuteront bien dans l'ordre !

  7. #7
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut
    c'est pas l'ordre qui me pause probleme, mais l'execution apres chargement du script (dans mon exemple, c'est les after qui me posent probleme)
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    15 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 15 488
    Points : 38 896
    Points
    38 896
    Par défaut
    Si on en revient à :
    comment implementeriez-vous ca
    je ferais à première vu quelque chose comme :
    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
    const Service = {
      queue: [],
      isStart: false,
      add: function (callback) {
        this.queue.push(callback);
        if( this.isStart) {
          this.action();
        }
        return this;
      },
      action: function () {
        while (this.queue[0]) {
          this.queue[0]();
          this.queue.shift();
        }
      },
      start: function () {
        this.isStart = true;
        this.action();
        return this;
      },
      stop: function () {
        this.isStart = false;
        return this;
      },
    }
    avec une utilisation du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Service
      .add(() => { console.log('service 1'); })
      .add(() => { console.log('service 2'); })
      .add(() => { console.log('---------'); });
    Service.start();
    Service
      .add(() => { console.log('service 3'); })
      .add(() => { console.log('service 4'); });
    Je ne sais pas si c'est ce que tu cherches à faire ou un truc dans ce style !

  9. #9
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut
    ton script fonctionne uniquement si le fichier qui contient ton Service a ete charge avant les appels a Service.add()

    ce que j'essaye de faire, c'est pouvoir stocker des commandes en attendant que le service soit charge, qu'il les charge (quand le service est charge), puis que les nouvelles commandes (post chargement) soit executees

    (mon probleme est si tordu que ca ?)
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 3 089
    Points : 6 729
    Points
    6 729
    Par défaut
    Citation Envoyé par Doksuri Voir le message
    pouvoir ajouter des commande avant & apres qu'un script soit telecharger, mais sans passer par un timeout degeu, ni par une solutions spagetti
    Moi ça me fait penser à Cron, où à la boucle principale des navigateurs et de la plupart des jeux vidéo. On a une « routine » qui consulte le tableau périodiquement (typiquement, 60 fois par seconde) et sa période est fixe, ce qui donne un certain nombre de garanties. Vouloir asservir le déclenchement de cette routine à ce qui se passe dans le tableau, c’est à mon avis se compliquer la vie. Donc je pense que dans le cas présent, un timeout n’est pas dégueu, c’est un cas d’utilisation tout à fait justifié.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Donc je pense que dans le cas présent, un timeout n’est pas dégueu, c’est un cas d’utilisation tout à fait justifié.
    ok, je vais donc rester sur cette formule (meme si elle ne me plait pas trop)
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  12. #12
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    15 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 15 488
    Points : 38 896
    Points
    38 896
    Par défaut
    ce que j'essaye de faire, c'est pouvoir stocker des commandes en attendant que le service soit charge,
    c'est quand même pas bien orthodoxe

    Il existe une solution d'« écoute » en passant par un new Proxy qui pourrait dans ce cas te convenir.

    Le principe étant d'encapsuler ton tableau monService.cmd dans un Proxy qui va intercepter les actions sur celui-ci et ce une fois ton init réalisé et après traitement des données déjà présentes.
    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
    var monService = {
      cmd: monService.cmd || [],
     
      init: function() {
        // on traite les éléments déjà stockés
        while (this.cmd[0]) {
          this.cmd[0]();
          this.cmd.shift();
        };
        // on encapsule l'array dans un Proxy
        this.cmd = new Proxy(this.cmd, {
          set: function(target, prop, val) {
            if ("function" === typeof val) {
              val();
              target.unshift();
            }
            return true;
          },
        })
      }
    };
    Le peu que je viens de tester semble fonctionner.

  13. #13
    Membre expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 122
    Points : 3 786
    Points
    3 786
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Il existe une solution d'« écoute » en passant par un new Proxy qui pourrait dans ce cas te convenir.

    Le principe étant d'encapsuler ton tableau monService.cmd dans un Proxy qui va intercepter les actions sur celui-ci et ce une fois ton init réalisé et après traitement des données déjà présentes.
    genial ! c'etait typiquement un truc comme ca que je cherchais ! merci
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer alias pour lancer commande en console ?
    Par snoop dans le forum Windows XP
    Réponses: 8
    Dernier message: 23/10/2006, 16h47
  2. Réponses: 1
    Dernier message: 07/09/2006, 01h52
  3. [Reflect] Créer un array d'objets avec le nom de leur classe
    Par Onarap dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 12/06/2006, 12h24
  4. J'aimerais créer des boutons de commandes dynamiquement??
    Par STRUFIELD dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 06/12/2005, 20h52
  5. [VBA-W] Créer un bouton de commande
    Par maketossss dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/11/2005, 17h07

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