2017-02-07 6 views
2

Ich habe eine Observable, die alle X Sekunden eine Aktion ausführen soll. Der Wert von X ändert sich dynamisch. Ich habe Probleme damit, meinen Kopf darüber zu wickeln, wie man dieses Intervall während der Laufzeit ändern kann. Nach meinem Verständnis ist es ein großer Durchbruch in meinem Denken, dass Observables sich nicht ändern können, sobald sie einmal definiert sind. Der Versuch, den Observalbe mit einem neuen Intervallwert neu zu definieren, scheint nicht der richtige Weg zu sein.rxjs beobachtbares Wechselintervall

ich versucht haben, mit dem Code bei https://www.learnrxjs.io/operators/transformation/switchmap.html

weit So befindet sich zu arbeiten, denke ich, dass switchMap zumindest auf dem richtigen Weg ist. Könnte jemand ein Beispiel geben oder mich auf Ressourcen hinweisen, die mir helfen könnten?

Bei der Pacht, die Arbeit benötigt definitiv mehr RxJs Beispiele!

Antwort

3

Sie können den Zeitraum dynamisch mit einem Subject zusammen mit switchMap und interval steuern. Immer dann, wenn der Gegenstand einen Wert abgibt, kann dieser Wert verwendet werden, um das Intervall Periode zu spezifizieren:

const t = Date.now(); 
 

 
let subject = new Rx.Subject(); 
 
subject 
 
    .switchMap(period => Rx.Observable.interval(period)) 
 
    .do(() => console.log('some action at time T+' + (Date.now() - t))) 
 
    .take(8) 
 
    .subscribe(); 
 

 
subject.next(50); 
 
setTimeout(() => subject.next(100), 200); 
 
setTimeout(() => subject.next(200), 400);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

2

ein funktionierendes Beispiel Hinzufügen der Googler

HTML zu helfen:

<body> 
    <button id="start">Start</button> 
    <button id="stop">Stop</button> 
    <button id="update">Update</button> 
    <input id="i1" value=100></input> 
</body> 

JavaScript (TypeScript):

let startButton = document.getElementById('start'); 
let stopButton = document.getElementById('stop'); 
let updateButton = document.getElementById('update'); 
let i1 = document.getElementById('i1'); 

const start$ = Rx.Observable.fromEvent(startButton, 'click'); 
const stop$ = Rx.Observable.fromEvent(stopButton, 'click'); 
const update$ = Rx.Observable.fromEvent(updateButton, 'click') 

const period =() => (parseInt(i1.value)); 


Rx.Observable.merge(
    start$, 
    update$, 
) 
    .switchMap(() => { 
    return Rx.Observable.interval(period()).takeUntil(stop$); 
    }) 
    .subscribe(res => { 
    console.log('here in the subscription:' + res); 
    }) 
Verwandte Themen