Возвращать тему только для подписки

мой вопрос касается возврата ссылки на тему, не позволяя получателю делать .next() по теме.

Например, у меня есть служба, которая содержит тему и может запускать новые события по теме.

class ExampleService {
  private exampleSubject = new Subject<boolean>;

  // Ideally the only way to call next on the subject
  doNext() {
    this.exampleSubject.next(true);
  }

  getSubject() {
    // Ideally returning a reference to the subject but only with the 
    // ability to subscribe and listen for events, not to call .next()
    return this.exampleSubject;
  }
}

Опять же, я ищу способ, чтобы другие компоненты вызывали эту службу и получали тему, но могли только подписываться и прослушивать изменения, они не должны иметь возможности вносить изменения.

ExampleService.getSubject().subscribe(() => {
  //do something 
}) // ok
ExampleService.getSubject().next(true) // error/not allowed
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
258
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Официально рекомендуемый способ сделать это (при условии, что вы используете TypeScript) - принудительно перепечатать Subject в Observable (Subject является Observable, как и любой другой):

class ExampleService {
  private exampleSubject = new Subject<boolean>();
  observable$: Observable<boolean> = this.exampleSubject;

  ...
}

Теперь observable$ может быть общедоступным, потому что это обычный Observable. TypeScript не позволит вам вызвать, например, ExampleService.observable$.next(), потому что этот метод не существует в Observables.

Если вы используете только JavaScript, вы можете использовать exampleSubject.asObservable() для возврата Observable из субъекта.

Это обсуждение на GitHub RxJS также актуально: https://github.com/ReactiveX/rxjs/pull/2408

Спасибо! Это то, что я ищу. .asObservable() в сочетании с типом Observable идеально подходит!

Matt Mckeller 25.01.2019 22:00

Другие вопросы по теме