@mittwald/react-use-promise
Version:
Simple and declarative use of Promises in your React components. Observe their state and refresh them in various advanced ways.
47 lines (46 loc) • 1.34 kB
JavaScript
import { DateTime, Duration } from "luxon";
export class ConsolidatedTimeout {
callback;
startTime;
timeoutMillis = new Set();
runningTimeout;
constructor(callback) {
this.startTime = DateTime.now();
this.callback = callback;
}
start() {
this.startTime = DateTime.now();
this.startNextTimeout();
}
clear() {
if (this.runningTimeout) {
clearTimeout(this.runningTimeout);
this.runningTimeout = undefined;
}
}
addTimeout(timeout) {
const timeoutMs = Duration.fromDurationLike(timeout).toMillis();
this.timeoutMillis.add(timeoutMs);
this.startNextTimeout();
return () => {
this.timeoutMillis.delete(timeoutMs);
this.startNextTimeout();
};
}
startNextTimeout() {
this.clear();
if (this.timeoutMillis.size === 0) {
return;
}
const shortestTimeout = Math.min(...this.timeoutMillis);
const elapsedTime = this.startTime.diffNow().negate().toMillis();
const ms = shortestTimeout - elapsedTime;
if (ms <= 0) {
this.callback();
}
else {
this.runningTimeout = setTimeout(() => this.callback(), ms);
}
}
}
export default ConsolidatedTimeout;