【发布时间】:2018-04-05 08:22:47
【问题描述】:
在一些地方我需要调用 setTimeout,例如:
setTimeout(() => this.isSaving[index] = false, 500);
当我的组件被销毁时,该超时是否会继续发出?换句话说,我是否需要捕获返回的 observable,如下所示:
this.subTimeout = setTimeout(() => this.isSaving[index] = false, 500);
然后在我的销毁钩子中取消订阅:
ngOnDestroy() {
this.subTimeout.unsubscribe();
}
如果我必须在我的组件中启动多个 setTimeouts,这会变得很费力。有没有更简单的方法来摧毁它们?可能像 takeUntil(destroy$) 一样?
【问题讨论】:
-
如果您想要一种方便的方式来执行 takeUntil(destroy$),您可以查看这个问题:stackoverflow.com/questions/40737752/…
-
谢谢,但我认为,由于您无法订阅 setTimeout,因此您无法使用 takeUntil(destroy$)。此外,您提供的链接使销毁订阅过于复杂。你不需要装饰器,你只需要一个主题: private destroy$ = new Subject(); ngOnDestroy() { this.destroy$.next(); }
-
如果你希望它是可观察的,你可以使用
Observable.timer(1000)而不是setTimeout。至于它过于复杂,我使用基类版本,它简化了销毁,因为如果它们是在 ngOnInit 中创建的,我不必跟踪订阅或处理空检查。它还允许通过 onChanges 观察 @Inputs。 -
@bygrace 谢谢,我不知道 Observable.timer(1000)。
-
@bygrace 我看到了基类解决方案的优势,但我现在必须检查所有组件,更改它们以继承它,然后检查我实现的每个生命周期钩子以调用 super.由于我已经将 next.destroy$ 包含在其中,因此至少现在保持这种方式更容易。但是感谢分享那篇文章,我给了它一个 +1,因为它很有用。
标签: javascript angular rxjs settimeout