2016-03-24 7 views
0
var sourceInit = Rx.Observable.timer(0, 1000) 
.do(x => console.log('timer', x)) 

let source = sourceInit.map(x => x*10) 

source.subscribe(x => { 
    console.log('x', x) 
}) 

source.subscribe(x => { 
    console.log('x2', x) 
}) 

Die outpu ich habe:Rxjs loszuwerden Doppel Abonnement

timer 0 
x 0 
timer 0 
x2 0 
timer 1 
x 10 
timer 1 
x2 10 
timer 2 
x2 20 
timer 2 

ich nur einzelne Abonnement-Timer und eine Ausgabe wie diese haben müssen:

timer 0 
x 0 
x2 0 
timer 1 
x 10 
x2 10 
timer 2 
x 20 
x2 20 

Was die richtige ist Ansatz für dieses Problem sollte sein?

bekam ich mit diesem Ansatz Thema mit:

var sourceInit = Rx.Observable.timer(0, 1000) 
.do(x => console.log('timer', x)) 

var source = new Rx.Subject(); 
sourceInit.subscribe(source) 

source.subscribe(x => { 
    console.log('x', x) 
}) 

source.subscribe(x => { 
    console.log('x2', x) 
}) 

Ist es richtig, und man nur?

Antwort

2

Das doppelte Abonnement-Problem, das Sie Erfahrung haben, hat mit der kalten gegenüber heißen Natur von Rx Observablen zu tun. Observables sind standardmäßig kalt, also wenn Sie sie abonnieren, beginnen Sie von Anfang an. Sie können eine detaillierte Erklärung dessen finden, was hier passiert: Hot and Cold observables : are there 'hot' and 'cold' operators?. Dies wurde mit Rxjs V4 gemacht, sollte aber auch für Rxjs V5 gelten.

Eine gängige Lösung besteht darin, die Observable, die Sie abonnieren möchten, mehrmals "heiß" zu machen (die Themen sind heiß, also funktioniert Ihre Lösung). Allerdings müssen hier keine Fächer verwendet werden. Um eine kalte Quelle heiß zu machen, können Sie eine Reihe von Operatoren verwenden, wobei share die üblichere ist:

var sourceInit$ = Rx.Observable.timer(0, 1000) 
     .share() 
     .do(x => console.log('timer', x)) 

let source$ = sourceInit$.map(x => x*10) 

source$.subscribe(x => { 
    console.log('x', x) 
}) 

source$.subscribe(x => { 
    console.log('x2', x) 
})