いくつかの場所で、setTimeoutを呼び出す必要がありました。例:
setTimeout(() => this.isSaving[index] = false, 500);
コンポーネントが破棄された場合、そのタイムアウトは引き続き発生しますか?言い換えると、次のように、返されたオブザーバブルをキャプチャする必要がありますか?
this.subTimeout = setTimeout(() => this.isSaving[index] = false, 500);
次に、破棄フックでサブスクライブを解除します。
ngOnDestroy() {
this.subTimeout.unsubscribe();
}
コンポーネントで複数のsetTimeoutを開始する必要がある場合、これは面倒になります。それらすべてを破壊する簡単な方法はありますか?多分takeUntil(destroy $)のように?
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));
このアプローチでは、異なるタイムアウトIDを格納するために複数の変数は必要ありません。また、常にids配列にのpush
戻り値を指定すれば、すべてのタイムアウトが適切にクリアされることを確認できますsetTimeout
。
追記:ただしsetInterval
、常に通話をキャンセルし、無制限のサブスクリプションのサブスクリプションを解除する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加