RXJS Nested subscribers with the last subscriber active

Date: 2024-02-28
import { Subject, BehaviorSubject, Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';

// Een Subject om nieuwe subscribers te registreren
const subscriberSubject = new Subject<Observable<any>>();

// Een BehaviorSubject om de laatste Observable te houden
const lastObservableSubject = new BehaviorSubject<Observable<any>>(null);

// Subscribe op de subject die nieuwe subscribers registreert
subscriberSubject.pipe(
  switchMap(obs => {
    // Zodra er een nieuwe subscriber komt, update de laatste Observable
    lastObservableSubject.next(obs);
    // Return de Observable voor deze subscriber
    return obs;
  })
).subscribe();

// Functie om een nieuwe Observable te registreren
function registerObservable(obs: Observable<any>) {
  subscriberSubject.next(obs);
}

// Externe Observable die verandert
let externalObservable = new Observable<number>(observer => {
  let count = 0;
  const interval = setInterval(() => {
    observer.next(count++);
    if (count > 5) {
      clearInterval(interval);
      observer.complete();
    }
  }, 1000);
});

// Voorbeeld van het gebruik:
registerObservable(externalObservable);

// Simuleer 3 subscriptions die op verschillende tijden worden gedaan
const subscription1 = lastObservableSubject.subscribe(value => {
  console.log("Subscriber 1 received:", value);
});

const subscription2 = lastObservableSubject.subscribe(value => {
  console.log("Subscriber 2 received:", value);
});

const subscription3 = lastObservableSubject.subscribe(value => {
  console.log("Subscriber 3 received:", value);
});

// Simuleer dat 'subscriber 3' na 3 seconden unsubscribed wordt
setTimeout(() => {
  console.log("Unsubscribing 'Subscriber 3'...");
  subscription3.unsubscribe();
}, 3000);
83060cookie-checkRXJS Nested subscribers with the last subscriber active