2016-12-15 5 views
1

Wenn ich eine switchMap auf eine Observable anwende und das Ergebnis zurückgebe, erwarte ich, dass die Subskription dieses Ergebnisses nicht dazu führt, dass die Switch-Map erneut ausgeführt wird.switchMap ruft mehrmals die innere Funktion auf

Nehmen Sie den folgenden Code ein:

let myObservable = Observable.of('empty') 
    .switchMap(id => { 
     doWork(); 
     return Observable.of('test'); 
    } 
); 

myObservable.subscribe(x => console.log('subscription 1')); 
myObservable.subscribe(x => console.log('subscription 2')); 

function doWork() { 
    console.log('working!'); 
} 

Es produziert:

working! 
subscription 1 
working! 
subscription 2 

Was Im suchen, ist die doWork Methode nur einmal aufgerufen werden und eine Ausgabe wie folgt aus:

working! 
subscription 1 
subscription 2 

Weitere Ressourcen zur Antwort:

Cold vs Hot Observables

Antwort

0

Mehrere .subscribe() Anrufe auf die gleiche beobachtbare jeden (default) ihre eigene Instanz des Abonnements erhalten, so dass es wieder laufen lassen. Wenn Sie möchten, dass Ihr Stream seine Ergebnisse an mehrere Abonnements verteilt, können Sie .share() verwenden.

Natürlich; Angesichts der asynchronen Natur von Rx, selbst wenn Sie einen Multicast-Operator verwenden, ist es möglich, dass Ihr zweites Abonnement zu spät für den anfänglichen emittierten Wert ist. Sie können alles zusammen auszuloten und wenn Sie bereit sind .connect() die Upstream-beobachtbaren (so dass es heiß) mit .publish()

Hinweis: Nicht share() all die Dinge, überall; es kommt zu einem Leistungsaufwand, weil intern ein Referenzzähler erzeugt wird und alle Werte von dem Upstream zu allen Beobachtern emittiert werden, anstatt einfach den Wert von Upstream stromabwärts zu propagieren.

+1

Danke Mark. Ich habe kalte und heiße Observablen untersucht, und ich glaube, dass ich in diesem Fall ein heißes Observable haben möchte. Ist share das selbe wie eine publish() und dann eine connect()? – cgatian

+0

share() refcount und connect() wenn der erste Stream subskribiert wird. publish() lässt Sie alle Dinge abonnieren, bevor Sie connect() 'ing und beginnen, Upstream-Emissionen zu empfangen –

+0

Ist diese Art von RxJs ein Antipattern? Soll ich nach alternativen Möglichkeiten suchen? – cgatian

Verwandte Themen