这个问题在So上并不 fresh ,但我有一个与其他问题不完全相同的情景.

比方说我有一个班级Component

class Component {
  constructor() {
    this.resolvers = [];
  }

  addResolver() {
    return new Promise((resolve) => {
      this.resolvers.push(resolve);
    });
  }

  callResolvers() {
    this.resolvers.forEach((resolver) => resolver());
  }
}

然后我就有了这段代码

let components = [];

async function addComponent() {
  const component = new Component();

  components.push(component);

  await component.addResolver();

  console.log("resolver called");
}

function deleteComponents() {
  components = [];
}

function resolveComponents() {
  components.forEach((component) => component.callResolvers());
}

addComponent();
addComponent();
addComponent();

resolveComponents();

如果我拨打resolveComponents(),就会调用解析器.

我担心的是,如果我不是打resolveComponents(),而是打deleteComponents(),就像这样:

addComponent();
addComponent();
addComponent();

deleteComponents();

这些部件会被垃圾收集吗?

他们有未兑现的promise ,这些promise 的解决器存储在component.resolvers.

由于之前的组件在删除后将不可能到达,我猜测即使它们有未兑现的promise ,它们也将被收集.

这个问题的答案是什么?

推荐答案

您没有循环依赖项,调用deleteComponents会释放您对它们的唯一引用.这样组件就不会泄漏

Javascript相关问答推荐

使用JavaScript更改json值顺序

如何在不指定宽度和高度的情况下显示来自网址的下一张图像

在shiny 模块中实现JavaScript

积分计算和 colored颜色 判断错误

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

RxJS setTimeout操作符等效

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

WebRTC关闭navigator. getUserMedia正确

当运行d3示例代码时,没有显示任何内容

在grafana情节,避免冲突的情节和传说

在286之后恢复轮询

我在Django中的视图中遇到多值键错误

Use Location位置成员在HashRouter内为空

在使用REACT更改了CSS类之后,无法更改CSS样式

如何在.NET Core中将chtml文件链接到Java脚本文件?

VSCode中出现随机行

MarkLogic-earch.suggest不返回任何值

在FAQ Accodion应用程序中使用React useState时出现问题

如何在DYGRAPS中更改鼠标事件和键盘输入

如何确保预订系统跨不同时区的日期时间处理一致?