2016-03-21 18 views
0

Das Problem ist, dass startWith und shareReplay schlecht kombinieren.RxJS müssen shareReplay mit Standardwert

Wenn Sie source.startWith(0).shareReplay(1) verwenden, neue Abonnements werden immer mit 0 beginnen und shareReplay ist sinnlos, source.shareReplay(1).startWith(0) etwas besser funktioniert, aber in neuen Abonnements führen zwei Werte zu erhalten.

Erwartet:

source ---1---2----3---4----5 
ob1 0--1---2----3---4----5 
ob2    2--3---4----5 

Update: Scheint, wie auch mein minimiert Fall minimiert wurde. Mein Problem ist, dass ich ob1-ob2 wechseln switch verwenden, was bedeutet, ob1 wird direkt vor ob2 abonnierten abmelden. Seltsamerweise funktioniert es richtig, wenn ich nur shareReplay(1) verwende, aber die Kombination startWith(0).shareReplay(1) nicht.

const main$ = new Rx.Subject() 
const s1$ = new Rx.Subject() 


// Expected: 
// 0 1 2 2 3 4 

//const s2$ = s1$.shareReplay(1).startWith(0) 
// got: 
// 0 1 2 0 2 3 4 

//const s2$ = s1$.startWith(0).shareReplay(1) 
// got: 
// 0 1 2 2 0 3 4 

const s2$ = s1$.shareReplay(1) 
// got: 
// 1 2 2 3 4 

main$.switch() 
    .subscribe(
    v => console.log("1: " + v) 
) 

main$.onNext(s2$) 
s1$.onNext(1) 
s1$.onNext(2) 

main$.onNext(s2$) 

s1$.onNext(3) 
s1$.onNext(4) 

Antwort

1

Ich konnte Ihr Problem nicht reproduzieren, ich habe eine Frage gestellt: vgl. http://jsfiddle.net/qvb3xbqz/2/.

var counter = 0; 
var validation$ = Rx.Observable 
.fromEvent(document.getElementById('validation'), 'click') 
.map(function(){return ++counter}) 
.do(emits(ta_validation, 'First subscription')) 
.startWith(0) 
.shareReplay(1); 

setTimeout(function(){ 
    validation$.do(emits(ta_change, 'second subscription')).subscribe(function(){}) 
}, 1000); 

Eine Subskription wird sofort abonniert. Zweites Abonnement tritt nach 1s ein. Sie werden sehen, dass sie sich wie erwartet verhalten. Oder habe ich etwas falsch verstanden?

+0

Lustig, ich kann es nicht in einem einfachen Szenario reproduzieren, aber mein Problem war die Verwendung von 'Switch'. Ich habe hier ein Beispiel geschrieben: https://jsbin.com/jijediduga/1/edit?js,console – Dorus

+0

Ihr Problem könnte sein, dass das shareReplay ein einzelnes Abonnement zurückgibt? – davesnx

+0

Ihr Problem könnte bei der Verwendung von 'switch' liegen. "switch" scheint "flatMapLatest" ähnlich zu sein und wenn es genauso funktioniert, sollte es sich von der aktuellen beobachtbaren Quelle abmelden und die neue abonnieren. Das könnte erklären, warum Sie jedes Mal von Anfang an neu starten? In jedem Fall scheint 'shareReplay' gut zu funktionieren. Sie sollten das Verhalten der von Ihnen verwendeten Operatoren überprüfen. Auch, nur für den Fall, welche Version von Rxjs verwenden Sie? – user3743222