2017-08-12 1 views
2

Comment puis-je faire en sorte qu'un sujet émette une valeur à laquelle il est abonné?at Sujet émet une valeur à laquelle il est abonné

let mySubject = new Subject<string> 
// specify somehow that when you subscribe to mySubject, it emits 'foo' 

mySubject.subscribe(value => { 
    // get 'foo' here 
}); 
+3

Soit un 'BehaviorSubject' - qui en tant que valeur initiale - soit' ReplaySubject' - qui rejoue le nombre spécifié de la valeur la plus récente - en fonction de votre cas d'utilisation (qui ne peut pas vraiment être déduit de la question). – cartant

+0

Ceci est la réponse. 'Use 'BehaviorSubject'' – Skeptor

Répondre

0

Vous avez juste besoin de pousser les données dans le flux maintenant en utilisant .next

Le code ci-dessous devrait fonctionner:

const mySubject = new Subject() 

mySubject.subscribe(value => { 
    console.log(value) 
}); 

mySubject.next("foo") 
0

Non seulement vous pouvez émettre flux/valeur à partir d'un Subject réellement vous peut émettre un flux/une valeur vers plusieurs Observers. Cela signifie que vous pouvez attacher plusieurs observateurs à un Subject. Chaque Subject peut contenir une collection d'observateur. Lorsque vous vous abonnerez à ce sujet, il émettra un flux/une valeur pour chaque observateur de sa collection.

const subject = new Rx.Subject() 
// add an observer to the list of observers of the subject 
const sub1 = subject.subscribe(function(val){ 
     console.log("observer 1", val); 
}); 
// add another observer to the list of observers of the subject 
const sub2 = subject.subscribe(function(val){ 
     console.log("observer 2", val); 
}); 
// notify all observers in the list with "hi there" 
subject.next('hi there'); 

// remove observer1 from the list 
sub1.unsubscribe(); 

Non seulement cela, vous pouvez utiliser un sujet en tant qu'observateur et le fournir à un observable. Cela signifie que vous pouvez utiliser un sujet pour "multidiffuser" un observable à plusieurs observateurs.

// To "share" the observable tick$ with two observers, 
// this way, we can pipe all notifications 
// through a Subject, like so 

const tick$ = Rx.Observable.interval(1000); 
const subject = new Rx.Subject(); 
subject.subscribe(function(val){ 
    console.log('from observer 1: '+ val); 
}); 
subject.subscribe(function(val){ 
    console.log('from observer 2: '+ val); 
}); 
tick$.subscribe(subject); 

Afin de comprendre RxJs que vous avez à comprendre le Observer Pattern prescrit par “Gang Of Four”. Je vais vous suggérer d'essayer de comprendre le modèle d'observateur et j'espère que vous serez clair sur ce que fait la bibliothèque RxJs.

Il existe un autre merveilleux reference du livre de Learning JavaScript Design Patterns par Addy Osmani.

0

Je crois que votre description de ce que vous souhaitez avoir est en fait pas ce que vous souhaitez avoir ..

Par exemple, si vous voulez que votre sujet à foo émette chaque fois que quelqu'un y souscrit, vous pouvez étendre la assujettir.

https://jsfiddle.net/v11rndmt/

class MySubject extends Rx.Subject{ 
    constructor(){ super(); } 
    subscribe(oOrOnNext, onError, onCompleted){ 
    const subs = super.subscribe(oOrOnNext, onError, onCompleted); 
    this.next("foo") 
    return subs; 
    } 
} 

let sub = new MySubject() 
sub.subscribe(v => console.log(v)); 
sub.subscribe(v => console.log(v)); 
sub.subscribe(v => console.log(v)); 

Ce émettra foo 3 fois. La première fois qu'il y a seulement 1 abonné, donc il imprimera une fois. La deuxième fois il y en a deux, donc ça va imprimer deux fois. Le troisième il y a 3 donc il imprimera 3 fois. Ainsi, foo sera imprimé 6 fois.

Cependant, je ne trouve aucun cas d'utilisation pour cela. Ainsi peut-être vous devriez nous fournir plus d'informations.