我如何知道是否有对给定实例的任何引用?

问题描述

我正在构建一个队列,如果没有对该队列实例的引用,我想避免执行任何任务。

我已经用 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)