为什么在Angular&;中设置超时;显著提高运行时性能?

为什么在Angular&;中设置超时;显著提高运行时性能?,angular,Angular,这听起来有点抽象,但我真的很好奇这种行为的可能原因 设置: 角度9.1.0 所有组件都使用OnPush检测策略 我有一个组件(相当重的UI,带有flex布局),它在一个页面上用*Ng初始化了大约10次。此组件具有单个数字输入属性,可从中生成布局 当我使用: ngOnChanges(changes: SimpleChanges) { if (this.id) { this.initComponent(this.id); // this triggers component to

这听起来有点抽象,但我真的很好奇这种行为的可能原因

设置:

角度9.1.0
所有组件都使用OnPush检测策略

我有一个组件(相当重的UI,带有flex布局),它在一个页面上用*Ng初始化了大约10次。此组件具有单个数字输入属性,可从中生成布局

当我使用:

ngOnChanges(changes: SimpleChanges) {
   if (this.id) {
      this.initComponent(this.id); // this triggers component to be rendered
   }
}
渲染大约需要5-7秒

如果我使用:

ngOnChanges(changes: SimpleChanges) {
   if (this.itemId) {
          setTimeout(() => {
           this.initComponent(this.itemId ?? 0);
    }, 1);
  }
}

渲染所有内容需要不到1秒的时间。我正在寻找可能导致这种行为的想法,以便改进代码或了解当前代码中的缺陷。

Angular作为单线程应用程序运行。因此,当您尝试呈现UI时,它必须等待Javascript引擎完成其呈现处理

setTimeout()
是在本机代码中计划的。所以本质上,Javascript引擎退出到本机代码,本机代码(
setTimeout()
)呈现UI,然后退出返回到Javascript引擎,在那里它可以继续处理


因此,将您的UI代码放入
setTimeout()
将产生该结果。

Angular作为单线程应用程序运行。因此,当您尝试呈现UI时,它必须等待Javascript引擎完成其呈现处理

setTimeout()
是在本机代码中计划的。所以本质上,Javascript引擎退出到本机代码,本机代码(
setTimeout()
)呈现UI,然后退出返回到Javascript引擎,在那里它可以继续处理


因此,将您的UI代码放入
setTimeout()
会产生这样的结果。

这很有趣,同时也很奇怪,您能提供一个复制链接吗?可能是您的initComponent依赖于其他代码,需要5-7秒,请提供有关该函数的更多信息。是的,确实如此。我怀疑有什么东西阻塞了主线程,导致这些组件按顺序呈现,而如果我使用setTimeout,它会同时独立地呈现它们。我似乎不明白为什么。我需要花更多的时间来复制这个,我们有一个非常复杂的企业应用程序。也许在github页面上发布或搜索它?它们的响应速度非常快。这很有趣,同时也很奇怪,你能提供一个复制链接吗?可能是你的initComponent依赖于其他代码,需要5-7秒,请提供有关该函数的更多信息。是的,是的。我怀疑有什么东西阻塞了主线程,导致这些组件按顺序呈现,而如果我使用setTimeout,它会同时独立地呈现它们。我似乎不明白为什么。我需要花更多的时间来复制这个,我们有一个非常复杂的企业应用程序。也许在github页面上发布或搜索它?他们反应很快。