[英]Angular setTimeout Poor Performance
我有一个组件,每次都需要使用不同的@input
变量重新渲染,因为我在ngOnInit()
中实现了一些逻辑。 我通过在父组件中使用以下方法来执行此操作,其中showSettings
用于隐藏,然后在100ms
延迟后显示组件(带有新输入)。
private _reloadSettings() {
this.showSettings = false;
let a = performance.now();
setTimeout(() => {
this.showSettings = true;
console.log(performance.now() - a);
}, 100);
}
一切工作正常,除了重新渲染花费的时间比预期的要长,即它应该在 100 毫秒左右(或稍微多一点),但实际上我正在变得像8000ms
到10000ms
,并且每次重新渲染都会变得最糟糕。
在您的应用程序的其他部分,您正在做太多的工作。
在这种情况下,我们无法解决您的问题。 我会 go 关于调查angular 变化检测。
除此之外,我将向您展示在您的代码库中要查找的一些内容:
您可以从ChangeDetection.Default
切换到ChangeDetection.OnPush
。 这可能会破坏您的应用程序的某些部分,但如果您修复这些问题,您将获得与setTimeout
一样的所有应用程序范围的操作的巨大性能提升。
在上面的例子中,你正在监听 service observable,它可能是任何东西
constructor(myService) {
myService.data.subscribe(data => {
this.array = data.array;
});
}
上面的代码很糟糕,订阅永远不会被删除,这意味着浏览器无法从memory中删除组件,并且subscribe
方法中的代码每次都会运行。 在这种情况下很好,但如果你要在内部进行一些计算,它可能会很快变坏。
您可以通过以下方式修复它:
myService.data.pipe(
take(1),
).subscribe(data => {
this.array = data.array;
});
this.array$ = myService.data.pipe(
map(data => data.array),
// Uncomment next line, if the observable is used multiple time
// shareReply({ ... }), //
)
尝试使用 queueMicrotask 而不是 setTimeOut。
queueMicrotask(() => {
this.showSettings = true;
console.log(performance.now() - a);
});
SetTimeout 是一个宏任务。 setTimeout 中提供的回调 function 将被加载到回调队列(又名 MacroTaskQueue)中。 它一直等到调用堆栈为空。
微任务也有类似的行为。 但是,微任务获得更高的优先级,因此它在宏任务队列之前运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.