Если наблюдаемое (например: из HttpClient) завершается, нет необходимости отписываться.
Если источник наблюдаемого завершает или испускает ошибка , источник будет автоматически отписываться .
Например, когда у вас есть что-то вроде
http.get(...)
.pipe(
a(),
b(),
c(),
).subscribe(observer)
За кадром происходит несколько интересных вещей. Прежде всего observer
преобразуется в subscriber
. Класс Subscriber
расширяет Subscription
, который содержит логи отмены подписки c.
Каждый оператор (a
, b
и c
) в цепочке будет свой собственный экземпляр Subscriber
, потому что после первого subscribe
будет подписана также каждая наблюдаемая, возвращаемая их оператором (оператор - это функция, которая получает наблюдаемую и возвращает наблюдаемую) , В результате получается цепочка Subscriber
с.
// S{n} -> Subscriber {n} (in the order in which they are created)
http.get(...)
.pipe(
a(), // S4
b(), // S3
c(), // S2
).subscribe(observer) // S1
S1
- родитель ( destination ) S2
, S2
- родитель S3
и т. Д.
HttpClient.get
по существу совпадает с
new Observable(subscriber => {
// Make request
// On request ready
subscriber.next(resultOfTheRequest)
subscriber.complete(); // So here completes!
})
Исходный код
Важно отметить, что в этом случае параметр subscriber
будет равен S4
.
subscriber.complete()
совпадает с S4.complete()
. Когда это происходит, S4
будет передавать полное уведомление на S3
, которое, в свою очередь, будет передавать уведомление на S2
и так далее до тех пор, пока S1
не получит уведомление. На этом этапе он отменит подписку .
Когда подписчик откажется от подписки , все его потомки также будут отписаны.
Итак, отписаться от закрытого абонента (становится closed
после отмены подписки) безобидно, но избыточно .
1.
Если услуга предоставляется на уровне root ( например: providedIn: 'root'
), его ngOnDestroy
не будет вызываться. Насколько я заметил, он будет вызываться только в том случае, если служба будет уничтожена, как в случае, если вы предоставили ее на уровне компонента .
Вот демонстрация, иллюстрирующая это.
IMO, если услуга предоставляется на уровне root, вам не следует беспокоиться о том, чтобы отписаться от наблюдаемых. Однако, если ваша услуга предоставляется на уровне компонентов, вам следует отписаться.
2.
Как описано в предыдущих разделах, если ваши наблюдаемые завершены, независимо от того, где ваша служба предоставляется, Вы не должны беспокоиться о том, чтобы отписаться.
Если ваши наблюдаемые не завершают сами по себе (например, fromEvent
), и услуга не предоставляется при root уровень , вы должны вручную отписаться в ngOnDestroy
.
3.
A Subject
будет вести список активных подписчиков . Когда активный подписчик становится, неактивным , он будет удален из списка подписчиков.
Например, если у вас есть BehaviorSubject
в root -обеспечиваемой услуге, вам не стоит беспокоиться об отказе от ссылок.
На самом деле, более безопасный способ сделать это - позвонить по номеру Subject.unsubscribe()
. Subject.complete()
отправит полное уведомление своим подписчикам, а затем очистит список.