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)
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
Ihr Problem könnte sein, dass das shareReplay ein einzelnes Abonnement zurückgibt? – davesnx
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