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

Angular Discussion :

Fonctionnement de Observable multicast (doc google)


Sujet :

Angular

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 728
    Points : 250
    Points
    250
    Par défaut Fonctionnement de Observable multicast (doc google)
    Bonjour,
    je suis en train de lire la documentation angular de google et je ne comprend pas un exemple concernant le multicasting

    Voici le code
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    function multicastSequenceSubscriber() {
      const seq = [1, 2, 3];
      // Keep track of each observer (one for every active subscription)
      const observers = [];
      // Still a single timeoutId because there will only ever be one
      // set of values being generated, multicasted to each subscriber
      let timeoutId;
    *
      // Return the subscriber function (runs when subscribe()
      // function is invoked)
      return (observer) => {
        observers.push(observer);
        // When this is the first subscription, start the sequence
        if (observers.length === 1) {
          timeoutId = doSequence({
            next(val) {
              // Iterate through observers and notify all subscriptions
              observers.forEach(obs => obs.next(val));
            },
            complete() {
              // Notify all complete callbacks
              observers.forEach(obs => obs.complete());
            }
          }, seq, 0);
        }
    *
        return {
          unsubscribe() {
            // Remove from the observers array so it's no longer notified
            observers.splice(observers.indexOf(observer), 1);
            // If there's no more listeners, do cleanup
            if (observers.length === 0) {
              clearTimeout(timeoutId);
            }
          }
        };
      };
    }
    *
    // Run through an array of numbers, emitting one value
    // per second until it gets to the end of the array.
    function doSequence(observer, arr, idx) {
      return setTimeout(() => {
        observer.next(arr[idx]);
        if (idx === arr.length - 1) {
          observer.complete();
        } else {
          doSequence(observer, arr, idx++);
        }
      }, 1000);
    }
    *
    // Create a new Observable that will deliver the above sequence
    const multicastSequence = new Observable(multicastSequenceSubscriber);
    *
    // Subscribe starts the clock, and begins to emit after 1 second
    multicastSequence.subscribe({
      next(num) { console.log('1st subscribe: ' + num); },
      complete() { console.log('1st sequence finished.'); }
    });
    *
    // After 1 1/2 seconds, subscribe again (should "miss" the first value).
    setTimeout(() => {
      multicastSequence.subscribe({
        next(num) { console.log('2nd subscribe: ' + num); },
        complete() { console.log('2nd sequence finished.'); }
      });
    }, 1500);
    *
    // Logs:
    // (at 1 second): 1st subscribe: 1
    // (at 2 seconds): 1st subscribe: 2
    // (at 2 seconds): 2nd subscribe: 2
    // (at 3 seconds): 1st subscribe: 3
    // (at 3 seconds): 1st sequence finished
    // (at 3 seconds): 2nd subscribe: 3
    // (at 3 seconds): 2nd sequence finished
    Je ne comprends pas pourquoi la deuxieme souscription commence a 2 secondes et non a 2.5 secondes. Meme chose pour 3 seconde au lieu de 3.5 secondes. Quelque chose m'echappe dans la logique. Si vous comprenez comment ca fonctionne, pouvez vous donner une explication detaillee ? Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Bonjour,

    C'est assez simple,

    Tu as une valeur qui est émise toutes les secondes.
    Donc la première souscription récupère les 3 valeurs.
    La seconde souscription est faites a 1,5 seconde du temps d’exécution, donc loupe la première valeur, mais à 2 secondes elle récupère bien la seconde valeur.

    Il faut bien séparer l’émission des valeurs , avec le moment ou la souscription est faites.

Discussions similaires

  1. Fonctionnement des moteurs de recherche: GOOGLE, MOZZILLA
    Par decouverte_web dans le forum Internet
    Réponses: 3
    Dernier message: 14/02/2015, 09h52
  2. Comment fonctionne le moteur de recherche Google ?
    Par Hinault Romaric dans le forum Services
    Réponses: 6
    Dernier message: 24/05/2013, 19h28
  3. [WD-2010] La capture ecran ne fonctionne pas avec un doc 2003
    Par patch2007 dans le forum Word
    Réponses: 3
    Dernier message: 02/03/2012, 09h40
  4. Multicast - fonctionnement
    Par Rodrigue dans le forum Développement
    Réponses: 2
    Dernier message: 19/10/2006, 16h59
  5. Réponses: 8
    Dernier message: 31/08/2006, 17h48

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