javascript - RxJS: Hur man kapslar in och observerar strängar för förändringar?
RxJS: Hur omsluter man en primitiv typ såsom en string i en Observable och lyssnar på förändringar av den primitiva?
Tänk på följande exempel. setTimeout simulerar någon extern händelse som ändrar strängen s. Dock körs console.log bara en gång och inte efter att setTimeout har kallats. Varför är det så?
let s = "Hello World";
Observable.of(s).subscribe(val => {
console.log(val);
});
// some external event changes variable s
setTimeout( () => {
s = "Wat?";
}, 1000);
// Output: prints "Hello World" to console, but not "Wat?"
Den här frågan kan låta lite dum, men jag sökte i 2 timmar genom alla möjliga RxJS-dokumentationer och exempel och de flesta av dem leker med arrayer eller objekt. Det är inte vad jag vill. Jag vill inte ändra attribut, funktioner, arrayer eller något sådant. Bara en enkel sträng, boolean eller nummer.
Svar #1
Jag inser att denna fråga har ett accepterat svar, men här är det rätta sättet att observera en sträng för förändringar med RxJS.
Skapa en variabel för typen ReplaySubject
stringVariable$: ReplaySubject<String> = new ReplaySubject<String>();
Tilldela alla nya värden till stringVariable via en funktion för att fånga uppdateringshändelsen.
assignNewValue(newValue: String) {
this.stringVariable$.next(newValue);
}
Prenumerera på detta Observable
stringVariable$.subscribe((newValue: String) => {
console.log(newValue);
});
Alternativt kan du använda en BehaviourSubject om din strängvariabel har ett initialvärde från början.
Svar #2
Du tänker på strömmar på fel sätt. Hela poängen med strömmen är att du inte ska ändra objekt direkt (strängar kan faktiskt inte ändras som @Pointy redan nämnt, men detta är en mer generell poäng).
Du behöver ändra ditt sätt att tänka till att se data som oföränderlig och flödet som att representera den förändring som du reagerar på i prenumeranten.
I ditt exempel, om du ville "mutera" en sträng, är det du egentligen försöker göra att fånga en uppsättning förändringar och visa dem genom next-hanteraren av subscribe-metoden. Var dessa förändringar kommer ifrån är irrelevant ur strängens perspektiv, den bryr sig bara om att händelser passerar igenom den.
d.v.s. Jag skulle kunna göra följande för att avge olika strängar:
Rx.Observable.timer(1000)
.mapTo('Wat')
.startWith('Hello World!')
.subscribe(x => console.log(x));
Det du behöver avgöra är vad källan till dina förändringar är och vilka händelser den bör sända. Därifrån kan Rx hjälpa dig att bearbeta dessa data till något som du kan använda vidare.
