2017-02-16 2 views
0

ich zwei Ströme haben, das sieht wie folgt:Weiter nach Strom abonnieren

const source1 = Rx.Observable.of([1,2,3,4,5]) 
    .map(() => "I am source 1") 
    .do((x) => console.log(x)); 
const sub1 = source1.subscribe((v) => console.log("Subscribe 2")); 

const source2 = Rx.Observable.fromEvent(document, 'click') 
    .do(() => console.log("execute!")) 
    .switchMapTo(source1) 
    .do(() => console.log("After switch map.")) 
    .map((x) => "source2"); 

source2.subscribe((x) => console.log(x)); 

Ohne Klick auf Dokument, das ich folgende Ausgabe haben:

"I am source 1" 
"Subscribe 2" 

Weitere Klicks ist die Ausgabe:

Wie kann ich den Strom zwingen source1 durch weitere Klicks abonnieren und nach dem Streamfortsetzen?

Ich erwarte nach mehreren Klicks folgende Ausgabe:

"I am source 1" 
"Subscribe 2" 
"execute!" 
"I am source 1" 
"After switch map." 
"source2" 

Antwort

1

Observable kann als Funktionen betrachtet werden. Und das Abonnieren ist wie das Anrufen einer Funktion.

d.h

const o = Rx.Observable.of(1); 
o.subscribe(x => console.log(x)); 

ist sehr ähnlich zu

const f =() => 1; 
console.log (f()); 

Genau wie eine Funktion aufrufen, die Funktion nicht ändern. Die Anmeldung bei einem Observable ändert die Beobachtbarkeit nicht. Das Abonnement ist in keiner Weise an das Observable angefügt. Es ist das zurückgegebene Abonnement, das einen beliebigen Status enthält.


Die beiden Anrufe in Ihrem Beispiel sind völlig unabhängig und ist das gleiche wie diese abonnieren:

const source1 = Rx.Observable.of([1,2,3,4,5]) 
    .map(() => "I am source 1") 
    .do((x) => console.log(x)); 
const sub1 = source1.subscribe((v) => console.log("Subscribe 2")); 

const source1_v2 = Rx.Observable.of([1,2,3,4,5]) 
    .map(() => "I am the same as source 1") 
    .do((x) => console.log(x)); 

const source2 = Rx.Observable.fromEvent(document, 'click') 
    .do(() => console.log("execute!")) 
    .switchMapTo(source1_v2) 
    .do(() => console.log("After switch map.")) 
    .map((x) => "source2"); 

source2.subscribe((x) => console.log(x));