现在我使用这个函数来更新一些超时,而不必通过回调。
private _changeTimeout(timeout: NodeJS.Timeout, at: milliseconds): NodeJS.Timeout {
// @ts-expect-error
const timeout = setTimeout(timeout._onTimeout, at);
clearTimeout(timeout);
return timeout;
}
有没有更好的方法,而不必使用私有变量来强迫我使用// @ts-expect-error
?
是:为setTimeout
创建您自己的包装器,这样您就不必使用未记录的Timeout
类的内部属性。使用未记录的内部属性总是会对维护造成危害。
有点像:
class MyTimeout {
private timeout: NodeJS.Timeout | null = null;
constructor(
private callback: (...args: any[]) => void,
public ms: number,
paused?: boolean,
) {
if (!paused) {
this.set();
}
}
set(ms?: number) {
if (typeof ms !== "undefined") {
this.ms = ms;
}
this.timeout = setTimeout((...args) => {
this.callback(...args);
this.timeout = null;
}, this.ms);
}
clear() {
if (this.timeout) {
clearTimeout(this.timeout);
this.timeout = null;
}
}
change(ms: number) {
const running = this.isRunning();
this.clear();
this.ms = ms;
if (running) {
this.set(ms);
}
}
get isRunning() {
return this.timeout !== null;
}
}
用法:
const t = new MyTimeout(() => {
// ...
}, 1000);
// ...
t.change(2000);
操场上联系
这可能有点夸张,但是你明白我的意思。