Зачем использовать шаблон функции получения / фабрики Rx JS .asObservable ()? - PullRequest
1 голос
/ 18 апреля 2020

Во многих кодовых базах, использующих Rx JS, я, кажется, сталкиваюсь с шаблоном выставления частного Subjects как Observables через getter или обычную getObservable() функцию. Мой вопрос не в том, почему используется .asObservable(), а в том, почему он выглядит так часто заключенным в функцию получения / фабрики?

asObservable (), заключенным в функцию получения / фабрики


private readonly _engineInfo$ = new Subject<EngineInfo>();
get engineInfo$() { return this._engineInfo$.asObservable(); }

asObservable () в качестве переменной экземпляра


private readonly _engineInfo$ = new Subject<EngineInfo>();
public engineInfo$ = this._engineInfo$.asObservable();

Вопросы


  • Я не понимаю, что .asObservable() создает новый Observable каждый раз, когда подписывается на Subject. Также созданный Observable является горячим и может быть подписан несколько раз. Зачем создавать несколько анонимных экземпляров Observable, (по одному для каждого доступа / подписки) вместо того, чтобы иметь только один Observable, доступ к которому осуществляется в одном классе / услуге, на который подписываются все наблюдатели к?
  • Есть ли неочевидное преимущество для этого шаблона getter/factory function?
  • Может ли это быть из-за преимуществ сборки мусора или тестирования / насмешки?

Пока что я использую установку переменных экземпляра из второго примера во всех сервисах / классах, и все, кажется, работает, как ожидалось, также с несколькими наблюдателями.

1 Ответ

0 голосов
/ 19 апреля 2020

Когда использовать Subject.prototype.asObservable ()

Цель этого состоит в том, чтобы предотвратить утечку «стороны наблюдателя» субъекта из API. В основном, чтобы предотвратить утечку абстракций, когда вы не хотите, чтобы люди могли «переходить» в конечную наблюдаемую область.

Вы никогда не захотите возвращать экземпляр Subject в вызывающий контекст. Это было бы в некотором роде возвращением отложенного объекта, а не обещания; и это оставило бы Предмет открытым для непредвиденного и искажающего использования. Таким образом, при экспонировании субъекта вы, возможно, захотите сначала преобразовать его в Observable.

Чтобы это работало, мы можем использовать метод экземпляра Rx.Observable.prototype.asObservable().

Сам объект является горячим / разделяемым , и он действует как мост / прокси между наблюдаемым источником и многими наблюдателями, позволяя нескольким наблюдателям совместно использовать одно и то же наблюдаемое выполнение.

Есть ли не Очевидное преимущество этого шаблона функции получения / фабрики?
Нет, совсем нет, так как вы создаете новую Observable с этим Субъектом в качестве источника, чтобы скрыть его от кода, который использует Observable.

Когда использовать asObservable () в rx js?

...