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')
);