@lifaon/rx-js-light
Version:
Blazing fast Observables
37 lines (36 loc) • 1.11 kB
JavaScript
import {createTimeout} from "../../../../../../misc/timer/create-timeout.mjs";
export function throttleTimeObservable(subscribe, duration, {leading = true, trailing = true} = {}) {
return emit => {
let lastSendValueTime = leading ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;
let abortTimeout = null;
let trailingValue;
const _emit = value => {
lastSendValueTime = Date.now();
emit(value);
};
const unsubscribe = subscribe(value => {
const elapsedTime = Math.max(0, Date.now() - lastSendValueTime);
if (elapsedTime >= duration) {
if (abortTimeout !== null) {
abortTimeout();
abortTimeout = null;
}
_emit(value);
} else if (trailing) {
trailingValue = value;
if (abortTimeout === null) {
abortTimeout = createTimeout(() => {
abortTimeout = null;
_emit(trailingValue);
}, duration - elapsedTime);
}
}
});
return () => {
unsubscribe();
if (abortTimeout !== null) {
abortTimeout();
}
};
};
}