77 lines
3.2 KiB
JavaScript
77 lines
3.2 KiB
JavaScript
|
"use strict";
|
||
|
var __extends = (this && this.__extends) || function (d, b) {
|
||
|
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
||
|
function __() { this.constructor = d; }
|
||
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
|
};
|
||
|
var Subscriber_1 = require('../Subscriber');
|
||
|
var asap_1 = require('../scheduler/asap');
|
||
|
/**
|
||
|
* Returns the source Observable delayed by the computed debounce duration,
|
||
|
* with the duration lengthened if a new source item arrives before the delay
|
||
|
* duration ends.
|
||
|
* In practice, for each item emitted on the source, this operator holds the
|
||
|
* latest item, waits for a silence for the `dueTime` length, and only then
|
||
|
* emits the latest source item on the result Observable.
|
||
|
* Optionally takes a scheduler for manging timers.
|
||
|
* @param {number} dueTime the timeout value for the window of time required to not drop the item.
|
||
|
* @param {Scheduler} [scheduler] the Scheduler to use for managing the timers that handle the timeout for each item.
|
||
|
* @returns {Observable} an Observable the same as source Observable, but drops items.
|
||
|
*/
|
||
|
function debounceTime(dueTime, scheduler) {
|
||
|
if (scheduler === void 0) { scheduler = asap_1.asap; }
|
||
|
return this.lift(new DebounceTimeOperator(dueTime, scheduler));
|
||
|
}
|
||
|
exports.debounceTime = debounceTime;
|
||
|
var DebounceTimeOperator = (function () {
|
||
|
function DebounceTimeOperator(dueTime, scheduler) {
|
||
|
this.dueTime = dueTime;
|
||
|
this.scheduler = scheduler;
|
||
|
}
|
||
|
DebounceTimeOperator.prototype.call = function (subscriber) {
|
||
|
return new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler);
|
||
|
};
|
||
|
return DebounceTimeOperator;
|
||
|
}());
|
||
|
var DebounceTimeSubscriber = (function (_super) {
|
||
|
__extends(DebounceTimeSubscriber, _super);
|
||
|
function DebounceTimeSubscriber(destination, dueTime, scheduler) {
|
||
|
_super.call(this, destination);
|
||
|
this.dueTime = dueTime;
|
||
|
this.scheduler = scheduler;
|
||
|
this.debouncedSubscription = null;
|
||
|
this.lastValue = null;
|
||
|
this.hasValue = false;
|
||
|
}
|
||
|
DebounceTimeSubscriber.prototype._next = function (value) {
|
||
|
this.clearDebounce();
|
||
|
this.lastValue = value;
|
||
|
this.hasValue = true;
|
||
|
this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
|
||
|
};
|
||
|
DebounceTimeSubscriber.prototype._complete = function () {
|
||
|
this.debouncedNext();
|
||
|
this.destination.complete();
|
||
|
};
|
||
|
DebounceTimeSubscriber.prototype.debouncedNext = function () {
|
||
|
this.clearDebounce();
|
||
|
if (this.hasValue) {
|
||
|
this.destination.next(this.lastValue);
|
||
|
this.lastValue = null;
|
||
|
this.hasValue = false;
|
||
|
}
|
||
|
};
|
||
|
DebounceTimeSubscriber.prototype.clearDebounce = function () {
|
||
|
var debouncedSubscription = this.debouncedSubscription;
|
||
|
if (debouncedSubscription !== null) {
|
||
|
this.remove(debouncedSubscription);
|
||
|
debouncedSubscription.unsubscribe();
|
||
|
this.debouncedSubscription = null;
|
||
|
}
|
||
|
};
|
||
|
return DebounceTimeSubscriber;
|
||
|
}(Subscriber_1.Subscriber));
|
||
|
function dispatchNext(subscriber) {
|
||
|
subscriber.debouncedNext();
|
||
|
}
|
||
|
//# sourceMappingURL=debounceTime.js.map
|