有没有更好的方法来更改 javascript 中的超时?
Is there a better way to change the timeout in javascript?
现在我正在使用这个函数来更新一些超时,而无需传递回调。
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 的未记录的内部属性。使用未记录的内部属性总是存在维护风险。
有点像:
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);
这可能有点矫枉过正,但你明白了。
现在我正在使用这个函数来更新一些超时,而无需传递回调。
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 的未记录的内部属性。使用未记录的内部属性总是存在维护风险。
有点像:
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);
这可能有点矫枉过正,但你明白了。