JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
JavaScript
const Observable = Rx.Observable;
let i = 1;
const init = () => Observable.of(42).delay(1000);
const status = id => Observable.of(i).delay(2000);
const repeat = status => i++ < 3;
const initialDelay = 3000;
const repeatDelay = 4000;
const run = () => {
let finished = false;
const delayStatus = (id, delay) => {
return Observable.of(null)
.delay(delay)
.do(() => console.log('status() called'))
.switchMap(() => status(id))
.do(status => console.log('status() returned'))
.map(status => [id, status]);
};
console.log('init() called');
return init()
.do(() => console.log('init() returned'))
.mergeMap(id => delayStatus(id, initialDelay))
.expand(([id]) => {
if (finished) {
return Observable.of([id, null]);
}
return delayStatus(id, repeatDelay);
})
.takeWhile(([_, status]) => {
if (repeat(status)) {
return true;
}
if (finished) {
return false;
}
finished = true;
return true;
})
.map(([_, status]) => status);
}
run().subscribe(
val => console.log('Value', val),
err => console.log('Error', err),
() => console.log('Observable completed')
);