javascript - RxJS - sänd endast om den andra inte sänder under fördröjning


Anta att jag har två observabler. Varje gång den första sänder något vill jag vänta 2 sekunder för att se om den andra observabeln sänder något under den perioden. Om ja, sänd inget. Om nej, sänd.

Exempel :

const start$ = this.events.pipe(
  delay(1000),
  takeUntil(theSecondObservable) // WHAT SHOULD BE HERE?
).subscribe((value) => {
  console.log(value);
});

Svar #1

Denna lösning slutförs inte när end$-observabeln sänder och använder RxJS 6-syntax.

const start$ = this.router.events.pipe(map(() => true));
const end$ = this.router.events.pipe(map(() => false));

merge(start$, end$)
  .pipe(debounceTime(2000), filter(value => value))
  .subscribe(value => console.log(value));

Om du filtrerar routerhändelser kanske du inte behöver två observabler.

this.router.events
  .pipe(debounceTime(2000), filter(event => event instanceof NavigationEnd))
  .subscribe(value => console.log(value));

Svar #2

Använd tävlingsoperatorn.

const start$ = race(this.events.pipe(delay(1000)), theSecondObservable).subscribe(value => /** ... */);

När en av de observerbara sänder ett objekt kommer den andra observerbara att ignoreras och endast värden som sänds av 'vinnaren' kommer att skickas vidare till prenumeranten. I din prenumerationsfunktion kan du utföra någon logik för att ta reda på vilken observerbar ditt värde kom från.

Relaterade artiklar