2016-12-20 3 views
1

RxJS: Wie man wie ein String in einem beobachtbare eine primitive Art Wickeln und hören, dass primitive auf Veränderungen?RxJS: Wie umranden und beobachten Sie die Zeichenkette für Änderungen?

Betrachten Sie das folgende Beispiel. setTimeout simuliert ein externes Ereignis, das die Zeichenfolge s ändert. Allerdings wird die console.log nur einmal ausgelöst und nicht nach setTimeout aufgerufen. Warum das?

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?" 

Diese Frage könnte ein bisschen dumm klingen, aber ich für 2 Stunden durch alle Arten von RxJS docs und Beispiele gesucht und die meisten von ihnen mit Arrays oder Objekte spielen. Das ist nicht was ich will. Ich möchte keine Attribute, Funktionen, Arrays oder ähnliches ändern. Nur eine einfache Zeichenfolge oder Boolean oder Zahl.

+3

Strings sind jedoch unveränderlich. – Pointy

+0

Gültiger Punkt. Also berücksichtigt RxJS das nicht? – ntaso

+1

Nun in Ihrem Beispielcode gibt es die primitive Zeichenfolge * value * '" Hello World "', und dann gibt es die * Variable * 's'. Es scheint so, als ob die Variable das beobachtete Objekt sein soll und nicht so sehr der String-Wert (was gut ist, weil der String-Wert sich nicht ändert). – Pointy

Antwort

2

Sie denken über Ströme falsch nach. Der springende Punkt des Streams ist, dass Sie nicht Objekte direkt mutieren sollten (Strings können eigentlich nicht mutiert werden, da @ Pointy bereits erwähnt wurde, aber das ist ein allgemeinerer Punkt).

Sie müssen Ihre Gedanken verschieben, um Daten als unveränderlich zu sehen, und der Stream als die Änderung darstellt, auf die Sie im Abonnenten reagieren. Wenn Sie in einem Beispiel eine Zeichenfolge "mutieren" möchten, erfassen Sie eine Reihe von Änderungen und blenden sie über den next -Handler der subscribe-Methode ein. Wo diese Änderungen herkommen, ist aus der Perspektive der Zeichenkette irrelevant, es ist nur wichtig, dass Ereignisse durch sie geleitet werden.

das heißt ich tun könnte, die folgenden verschiedenen Saiten zu emittieren:

Rx.Observable.timer(1000) 
    .mapTo('Wat') 
    .startWith('Hello World!') 
    .subscribe(x => console.log(x)); 

Was Sie bestimmen müssen, ist das, was die Quelle Ihrer Änderungen ist und welche Ereignisse sollten sie emittieren. Von dort kann Rx Ihnen helfen, diese Daten in etwas zu verarbeiten, das Sie stromabwärts verwenden können.

+0

Danke für die Erklärung. Nur um klar zu sein: RxJS hat nichts mit der veralteten Vanilla JS 'Object.observe()' Methode zu tun und nichts mit, sagen wir, Observablen in Knockout oder Angular 2 ?! Ich denke, ich dachte an RxJS als Ersatz für diese eher traditionellen Beobachter. Schließlich nannte sich RxJS selbst das * Lodash for Observables *, obwohl sie das scheinbar von der Website entfernt haben. – ntaso

1

Ich weiß, dass diese Frage eine akzeptierte Antwort hat, aber hier ist der richtige Weg, eine Zeichenfolge für Änderungen mit RxJS zu beobachten.

eine Variable für Typ erstellen ReplaySubject

stringVariable$: ReplaySubject<String> = new ReplaySubject<String>(); 

Assign alle neuen Werte stringVariable über eine Funktion, um die Update-Ereignis zu fangen.

assignNewValue(newValue: String) { 
    this.stringVariable$.next(newValue); 
} 

dieser beobachtbare

stringVariable$.subscribe((newValue: String) => { 
    console.log(newValue); 
}); 

Abonnieren Alternativ können Sie BehaviourSubject verwenden, wenn die Zeichenfolge-Variable einen Anfangswert hat, mit zu beginnen.

Verwandte Themen