import { forkJoin, Observable, Observer, of, ReplaySubject } from 'rxjs'; import { take } from 'rxjs/operators'; export function rxForkJoin(aObservables: Observable[]): Observable { // check the array return (aObservables && (aObservables.length > 0)) ? forkJoin(...aObservables) : of([]); } export function rxCacheSingle(aObservable: Observable): Observable { // helper subject const subject = new ReplaySubject(1); // status flag let bSubscribed = false; // create the subscriber return Observable.create((aObserver: Observer) => { // have we already subscribed? if (!bSubscribed) { bSubscribed = true; aObservable.pipe(take(1)).subscribe(subject); } // ok subject.pipe(take(1)).subscribe(aObserver); }); }