В нескольких местах мне нужно было вызвать setTimeout, например:
setTimeout(() => this.isSaving[index] = false, 500);
Когда мой компонент будет уничтожен, будет ли этот тайм-аут продолжать излучать? Другими словами, мне нужно захватить возвращаемое наблюдаемое, например:
this.subTimeout = setTimeout(() => this.isSaving[index] = false, 500);
а затем нечистый в моем крюке уничтожения:
ngOnDestroy() {
this.subTimeout.unsubscribe();
}
Это становится трудоемким, если мне нужно инициировать несколько setTimeouts в моем компоненте. Есть ли более простой способ уничтожить их всех? Может быть, с 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));
При таком подходе вам не понадобятся несколько переменных для хранения различных идентификаторов таймаута, и вы можете быть уверены, что все ваши тайм-ауты будут очищены правильно, если вы всегда push
возвращаемое значение setTimeout
в вашем массиве идентификаторов.
Примечание: вы всегда должны отменять вызовы setInterval
и всегда отказаться от подписки на открытые подписки.
setTimeout
?
Это зависит от того, что происходит внутри callback- setTimeout
, но обычно они должны быть отписаны. Нет никакого способа, как они могли бы быть волшебным образом отписаны. Их обратные вызовы будут уволены любым способом и могут вызвать ошибки или нежелательные побочные эффекты.
Хорошей практикой является назначение тайм-аута где-то, по крайней мере, для целей тестирования. То, что должно быть сделано в ngOnDestroy
, this.subTimeout.unsubscribe()
предполагает, что тайм-аут выполняется через RxJS:
this.subTimeout = Observable.timer(500).subscribe(() => {
this.isSaving[index] = false;
});
Способ, которым он может быть улучшен, зависит от того, для чего служат эти тайм-ауты.