我发现
rxJS docs将它们定义为
What is a Subject? An RxJS Subject is a special type of Observable that allows values to be multicasted to many Observers. While plain Observables are unicast (each subscribed Observer owns an independent execution of the Observable),Subjects are multicast.
它继续举例,但我正在寻找一个基本的ELI5解释.根据我的理解,它有助于处理和定义序列中的项目.那是对的吗?
我认为,在有和没有定义rxJS主题的情况下,看到一个简单的函数对我和其他人最有帮助,以了解为什么它很重要?
谢谢!
解决方法
理解它的最简单方法是将主体视为生产者和消费者.它就像一个开放的频道,有人可以在一端发送消息,任何订阅者都会在另一端收到消息.
+--------------- Sender | => => => => Subscriber -----------------------+ +----------- Message => => => => => => => => => => => Subscriber -----------------------+ +----------- | => => => => Subscriber +---------------
class MessageService { private _messages = new Subject<Message>(); get messages: Observable<Message> { return this._messages.asObservable(); } sendMessage(message: Message) { this._messages.next(message); } }
请注意消息getter将Subject作为Observable返回.这不是必需的.主题已经是可观察的,任何人都可以直接订阅主题.但我认为asObservable模式被用来限制用户可以用它做什么,即用户只用它来订阅,而不是发出.我们保存sendMessage方法的发射.
现在有了这个服务,我们可以将它注入到不同的组件中,这可以是两个(或更多)任意组件进行通信的方式(或者只是接收任意事件通知).
class ComponentOne { constructor(private messages: MessageService) {} onClick() { this.messages.sendMessage(new Message(..)); } } class ComponentTwo { constructor(private messages: MessageService) {} ngOnInit() { this.messages.messages.subscribe((message: Message) => { this.message = message; }); } }
Angular自己的EventEmitter
实际上是一个主题.当我们订阅EventEmitter时,我们订阅了一个Subject,当我们在EventEmitter上发出时,我们正在通过Subject向所有订阅者发送消息.