问题描述
我正在构建一个队列,如果没有对该队列实例的引用,我想避免执行任何任务。
我已经用 WeakRef
尝试过一些东西,但可能永远不会奏效。
const queue = () => {
const enqueue = () => {
console.log("enqueue");
setTimeout(() => {
if (instanceRef.deref()) {
console.log("the queue is still referenced so perform task");
}
});
};
const instance = { enqueue };
const instanceRef = new WeakRef(instance);
return instance;
};
b = queue();
b.enqueue();
b = null;
console.log("b is set to null so there are no references to the instance");
如果队列仍然存在但不太优雅,另一种方法是检查任务。
解决方法
不能依靠 WeakRef#deref()
来知道是否仍然存在对目标对象的(强)引用。它仅指示垃圾收集器是否已销毁对象并回收其内存。这可能会发生得更晚,也可能根本不会发生。
你想要的东西有点奇怪。您想通过将 null 分配给先前已启动超时功能的变量来神奇地停止超时功能。
您更想要的是有一种停止超时功能的方法。调用 setTimeout
会返回一个处理程序。存储此处理程序并调用内置方法
clearTimeout(handler)