2017-02-16 5 views
2

ich einen zuschaltbaren beobachtbar, die verbunden werden erhalten, wenn der andere Strom ausgeführt:Warum anschließbaren beobachtbaren bekommen ausführen nur einmal

const source1 = Rx.Observable.of([1,2,3,4,5]) 
    .do(() => console.log('Do Something!')) 
    .map(() => "Always connected.") 
    .publish(); 

source1.subscribe((v) => console.log(v)); 

const connect =() => { 
    let c = false; 
    return() => { 
    if (!c) { 
     console.log("Get connected"); 
     source1.connect(); 
     c = true; 
    } 
    } 
} 


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

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

Der Ausgang

"execute!" 
"Get connected" 
"Do Something!" 
"Always connected." 

Weitere Klicks auf dem Dokument source1 sein nicht mehr abonnieren und meine Frage ist, warum?

Antwort

1

Sie haben begegnet genau diese Situationen: Rx.Subject loses events

Wenn Sie den ersten Teil Ihrer Beispiel aktualisieren Sie werden sehen, dass das Thema eine complete Benachrichtigung erhält:

const source1 = Rx.Observable.of([1,2,3,4,5]) 
    .do(() => console.log('Do Something!'), null,() => console.log('source1 complete')) 
    .map(() => "Always connected.") 
    .publish(); 

Dies markiert das Thema als geschlossen und es wird keine weiteren Werte zurücktiemen.

über meine verknüpften Antwort finden Sie weitere Informationen. Sie könnten auch einen Blick auf On The Subject Of Subjects (in RxJS) von Ben Leine (leitender Entwickler von RxJS 5.

+0

Do (paragramp Themen Nicht wieder verwendbar sind) haben Sie Lösungsvorschläge haben? Sicherlich ist dies ein weit verbreitetes Muster, in dem Sie eine beobachtbare ausführen möchten Ich versuche, etwas Ähnliches mit RxSwift zu implementieren, wo ich eine verbindbare Observable habe, die eine Netzwerkanforderung umschließt.Wenn die Netzwerkanforderung fehlschlägt, möchte ich in der Lage sein, eine neue Verbindung herzustellen ... –

Verwandte Themen