debounceTime.js 1.5 KB

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