Лучше всего отказаться от подписки.takeUntil подходит для использования, если вы знаете, что метод очистки вашего класса фактически генерирует наблюдаемую очистку.дубль не всегда гарантирует, что наблюдаемое излучило.Могут быть случаи, когда вы знаете, что наблюдаемое определенно будет излучать хотя бы один раз, но все еще существует вероятность того, что утечка была создана.
Проблема с предположением, что наблюдаемое завершится, состоит в том, что вы не знаетеесли внутренности сервиса возвращают заметные изменения.Если вы предполагаете, что наблюдаемое является http-запросом и завершается в конце запроса, тогда будущий рефакторинг, который изменяет наблюдаемое на обработчик кэша, теперь создал утечку памяти, потому что вы не отписались.
Отмена подпискитакже отменяет любые текущие запросы.
Проблема с такими утверждениями, как
let sub = myObservable.subscribe(
v => doThing(v),
e => handle(e),
() => sub.unsubscribe(),
)
Если myObservable генерирует мгновенно, как BehaviorSubject, тогда sub не определено.Я хотел бы избежать такой отмены подписки и использовать takeUntil с темой.
const finalise$ = new Subject();
myObservable.pipe(takeUntil(finalise$)).subscribe(
v => doThing(v),
e => handle(e),
() => { finalise$.next(); },
);
Этот код гарантированно безопасен для отмены подписки.