Angular4 - 我是否需要取消订阅setTimeout调用?

rmc*_*rry 1 javascript settimeout rxjs angular

在一些地方我需要调用setTimeout,例如:

setTimeout(() => this.isSaving[index] = false, 500);
Run Code Online (Sandbox Code Playgroud)

当我的组件被销毁时,该超时会继续发出吗?换句话说,我需要捕获返回的observable,如下所示:

this.subTimeout = setTimeout(() => this.isSaving[index] = false, 500);
Run Code Online (Sandbox Code Playgroud)

然后取消在我的破坏钩子中:

ngOnDestroy() {
  this.subTimeout.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)

如果我必须在我的组件中启动几个setTimeout,这会很费力.有没有更简单的方法来摧毁它们?就像使用takeUntil(destroy $)一样?

Bee*_*ice 8

我是否需要取消订阅setTimeout调用?...当我的组件被销毁时,该超时是否会继续发出?

您无需担心重复执行回调.setTimeout只执行一次它就死了.通常很好的做法是考虑时间将耗尽的可能性,并且回调仅在组件被销毁之后才执行.在我自己的应用程序中,我将所有需要撤消的订阅都放入数组中,并且我有一个标准的批量取消订阅作业ngOnDestroy.您的超时也可以这样做:

// component property
timeOutIDs:number[] = [];
...
// triggering a timeout and capturing the id
this.timeOutIDs.push(
    setTimeout(() => this.isSaving[index] = false, 500)
);
...
// inside ngOnDestroy
this.timeoutIDs.forEach(id => clearTimeout(id));
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您不需要多个变量来存储不同的超时ID,并且如果始终pushsetTimeoutids数组中的返回值,则可以确保所有超时都将被正确清除.

附加说明:您应该始终取消setInterval呼叫并始终取消订阅开放式订阅.

  • 好吧,他问''当我的组件被摧毁时,超时会继续发出吗?'.简单的答案是:是的.更不用说清理它的良好做法,无论延迟设置如何.为了保存,如果他不想考虑这些事情,他会使用`Observable.timer`. (3认同)