debounceTime.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { asyncScheduler } from '../scheduler/async';
  2. import { operate } from '../util/lift';
  3. import { createOperatorSubscriber } from './OperatorSubscriber';
  4. export function debounceTime(dueTime, scheduler = asyncScheduler) {
  5. return operate((source, subscriber) => {
  6. let activeTask = null;
  7. let lastValue = null;
  8. let lastTime = null;
  9. const emit = () => {
  10. if (activeTask) {
  11. activeTask.unsubscribe();
  12. activeTask = null;
  13. const value = lastValue;
  14. lastValue = null;
  15. subscriber.next(value);
  16. }
  17. };
  18. function emitWhenIdle() {
  19. const targetTime = lastTime + dueTime;
  20. const now = scheduler.now();
  21. if (now < targetTime) {
  22. activeTask = this.schedule(undefined, targetTime - now);
  23. subscriber.add(activeTask);
  24. return;
  25. }
  26. emit();
  27. }
  28. source.subscribe(createOperatorSubscriber(subscriber, (value) => {
  29. lastValue = value;
  30. lastTime = scheduler.now();
  31. if (!activeTask) {
  32. activeTask = scheduler.schedule(emitWhenIdle, dueTime);
  33. subscriber.add(activeTask);
  34. }
  35. }, () => {
  36. emit();
  37. subscriber.complete();
  38. }, undefined, () => {
  39. lastValue = activeTask = null;
  40. }));
  41. });
  42. }
  43. //# sourceMappingURL=debounceTime.js.map