微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。