静态构造函数的清理



所以我正试图为我的库编写一些单元测试。但当我开玩笑时,我得到了可怕的:

Jest did not exit one second after the test run has completed.
This usually means that there are asynchronous operations that weren't
stopped in your tests. Consider running Jest with `--detectOpenHandles`
to troubleshoot this issue.

我已经追踪到我编写的一个特定类,它有一个静态构造函数块。在该块中,我启动setIntervalsetTimeout函数。不管怎样,我都试着用同样的方式开玩笑。

所以我知道Javascript没有析构函数是出于某种未知的原因(GC不是一个有效的原因。很多有GC的语言都有析构函数(。当代码准备关闭时,如何清理和停止setInterval

选项1:

class A {
static #blink = false;
static #blinker;
static {
A.#blinker = setInterval(() => {
A.#blink = !A.#blink;
}, 500);
}
}

选项2:

class B {
static #blink = false;
static #blinker = null;
static {
B.#doBlink();
}
static #doBlink() {
B.#blink = !B.#blink;
#blinker = setTimeout(() => B.#doBlink(), 500);
}
}

有许多选择:

  1. .shutdown().close()方法添加到对象中,并在处理完对象并希望计时器停止时调用该方法。

  2. 在计时器上调用.unref(),然后它们不会阻止nodejs自然关闭——当nodejs事件循环检测到是否有任何东西仍在运行时,它们不会被视为未完成的异步操作。

  3. 使用代码的逻辑(您没有显示(,找出何时不再需要计时器,并根据这些条件自然关闭setTimeout()setInterval()

最新更新