Возвращаются ли объекты BehaviourSubjects (как Observable) с помощью take (1) или отказа от подписки?

Если я возвращаю BehaviorSubject как Observable из службы и подписываюсь на этот Observable в компоненте, а затем вызываю take (1) или unsubscribe, продолжает ли BehaviorSubject испускать значения? Это происходит?

Редактировать Спасибо всем за ответы. Это проясняет мне ситуацию.


person cyberguy    schedule 09.01.2020    source источник
comment
Если вы используете take (1), будет использоваться первое выданное значение и не более того. Я имею в виду, что если вы отправите больше значений, они будут отправлены, но часть, в которой вы используете take (1), войдет в подписку только один раз, что тоже с первым отправленным значением.   -  person Ramesh Reddy    schedule 09.01.2020
comment
Что вы пробовали это проверить? Вы подключились к наблюдаемому объекту из BehaviorSubject в нескольких компонентах, отправили значения этому субъекту после отказа от подписки и видели эффекты в компонентах, на которые подписана подписка?   -  person Alexander Staroselsky    schedule 09.01.2020
comment
Да. Простой эксперимент: stackblitz.com/edit/rxjs-x8q4ee?devtoolsheight=60 . Тема - это горячая многоадресная наблюдаемая, поэтому вы можете подписаться несколько раз, и события будут многоадресной рассылкой для каждого наблюдаемого. Отказ от подписки на один обервер не влияет на остальные.   -  person JB Nizet    schedule 09.01.2020


Ответы (2)


Наблюдаемые объекты (которые на самом деле являются просто фабриками для наблюдаемых потоков), как правило, не зависят от их подписчиков. Однако они МОГУТ быть реализованы таким образом, что отказ от подписки повлияет на других подписчиков. Однако это не относится к BehaviorSubject.

Как правило, вы не хотите изменять другие потоки, когда подписчик отказывается от подписки. Это будет противоречить целям эластичности и отказоустойчивости реактивного программирования (общее состояние потенциально создает узкие места и приводит к распространению ошибок в другие потоки)

Итак, да, BehaviorSubject будет продолжать отправлять другим подписчикам, пока это не будет завершено. Однако оно не будет отправлено take(1) подписчику в любое время после отправки первого уведомления.

person ggradnig    schedule 09.01.2020

В этом сценарии есть две разные роли: Observable и Observer (тот, кто подписывается на Observable). Действия, предпринимаемые Observer, не влияют на поведение Observable, поэтому, если Observer отписывается от Observable, это не влияет на сам Observable. Другие наблюдатели на этот Observable продолжают подписываться, а Observable продолжает передавать значения.

person Matheus Cassol    schedule 09.01.2020