2017-09-17 2 views
0

Consultez le code suivantComment faire un partage observable entre abonnés en angle 4?

getObservable() { 
    return this.http.get('get_something').map(
     data => { 
      return true; 
     }, 
     err => { 
      return false; 
     } 
    ); 
} 

subscriber_1 = this.getObservable().subscribe(
    data => { 
     console.log("from subscriber 1", data); 
    } 
); 

subscriber_2 = this.getObservable().subscribe(
    data => { 
     console.log("from subsriber 2", data); 
    } 
); 

for (var _i = 0; _i < 100; _i++) { 
    this.getObservable() 
} 

Je me attends from subscriber 1 et from subsriber 2 pour obtenir imprimer 100 fois. Cependant, il est seulement imprimé 1 temps.

Je pensais que les observables sont des vecteurs et non des scalaires, de sorte que chaque fois que le même observable est invoqué, il invoquera tous les abonnés?

Je dois faire quelque chose de mal.

Quelqu'un peut-il aider?

Merci

+0

Vous appelez votre demande dans votre déclaration de retour deux fois, puisque vous appelez votre fonction deux fois. Vous devriez plutôt écrire un membre de votre classe en tant que '' Sujet '', vous pouvez y ajouter une inscription, puis y ajouter des valeurs pour avertir les observateurs. –

+0

pouvez-vous montrer une capture d'écran de votre sortie de la console? (je voulais juste m'assurer que vous ne voyiez pas l'augmentation de 'compte' dans la sortie comme 'bulle' sur la même ligne quand une sortie est répétée dans la console) – amal

Répondre

1

Voici ce que vous faites:

  1. Vous créez une fonction qui crée une demande et renvoie une valeur.
  2. Le premier abonné subscriber_1 fait la demande et lorsque vous appelez la fonction d'abonnement attend seulement la demande en cours pour recevoir une réponse.
  3. Lorsque vous faites la boucle, vous faites une demande. Vous ne faites rien pour gérer la réponse à ces demandes.

Si loin de ce que je comprends, vous voulez utiliser un Subject de RxJS.

let subject: Subject<any> = new Subject<any>(); 

// Anytime the subject value is changed a notification is triggered 
// The subscribe function is handling it 
let subscriber_1 = subject.AsObservable().subcribe((data) => { 
    console.log(data); 
    return data; 
}) 

// Trigger a notification 100 times 
for(let i = 0; i < 100; i++) { 
    subject.next(i); 
} 

Voici un un bon article où vous pouvez comprendre plus sur Subject classe https://medium.com/@benlesh/on-the-subject-of-subjects-in-rxjs-2b08b7198b93

Ou

Si vous ne souhaitez pas utiliser un RxJS vous devez mettre en œuvre un modèle observable.

http://www.dofactory.com/javascript/observer-design-pattern Voici une bonne explication avec un exemple.