Skip to content

exhaustMap - Negeer nieuwe invoer tijdens uitvoering ​

De exhaustMap operator negeert nieuwe invoer tot de momenteel verwerkende Observable is voltooid. Dit is ideaal voor het voorkomen van dubbele klikken of meerdere inzendingen van verzoeken.

🔰 Basissyntax en gebruik ​

ts
import { fromEvent, of } from 'rxjs';
import { exhaustMap, delay } from 'rxjs';

const clicks$ = fromEvent(document, 'click');

clicks$
  .pipe(exhaustMap(() => of('Verzoek voltooid').pipe(delay(1000))))
  .subscribe(console.log);

// Output voorbeeld:
// (Alleen de eerste klik geeft "Verzoek voltooid" uit na 1 seconde)
  • Volgende invoer wordt genegeerd tot het lopende verzoek is voltooid.

🌐 RxJS Officiële Documentatie - exhaustMap

💡 Typische gebruikspatronen ​

  • Preventie van meerdere klikken op formulier submit-knoppen
  • Preventie van dubbele verzoeken (vooral voor login- en betalingsprocessen)
  • Enkelvoudige weergavecontrole van een modal of dialoog

🧠 Praktisch codevoorbeeld (met UI) ​

Klikken op de Verzend-knop start het verzendproces. Het maakt niet uit hoe vaak u klikt tijdens verzending, het wordt genegeerd en de volgende verzending wordt niet geaccepteerd tot het eerste proces is voltooid.

ts
import { fromEvent } from 'rxjs';
import { exhaustMap, delay } from 'rxjs';
import { ajax } from 'rxjs/ajax';

// Maak knop
const submitButton = document.createElement('button');
submitButton.textContent = 'Verzenden';
document.body.appendChild(submitButton);

// Maak uitvoergebied
const output = document.createElement('div');
output.style.marginTop = '10px';
document.body.appendChild(output);

// Verzendverwerking
fromEvent(submitButton, 'click')
  .pipe(
    exhaustMap(() => {
      output.textContent = 'Verzenden...';
      return ajax
        .post('https://jsonplaceholder.typicode.com/posts', {
          title: 'foo',
          body: 'bar',
          userId: 1,
        })
        .pipe(delay(2000)); // Simuleer 2 seconden verzendvertraging
    })
  )
  .subscribe({
    next: (response) => {
      output.textContent = 'Verzending succesvol!';
      console.log('Verzending succesvol:', response);
    },
    error: (error) => {
      output.textContent = 'Verzendfout';
      console.error('Verzendfout:', error);
    },
  });
  • Andere klikken terwijl de knop wordt geklikt worden genegeerd.
  • Na 2 seconden ziet u "Verzending succesvol!" of "Verzendfout" wordt weergegeven.

Uitgebracht onder de CC-BY-4.0 licentie.