什么是RxJS主题和使用它们的好处?

我发现rxJS文档将它们定义为

什么是主题? RxJS主题是一种特殊类型的Observable,它允许将值传递给许多观察者。 虽然简单的Observable是单播的(每个订阅的Observer拥有一个独立的Observable执行),但Subjects是多播的。

并继续举例说明,但我正在寻找一个基本的ELI5解释。 根据我的理解,它有助于处理和定义序列中的项目。 那是对的吗?

我认为,对于我和其他人来说,看到一个简单的功能对于定义一个rxJS主体是否理解为什么它很重要会有帮助。

谢谢!


理解它的最简单方法是将Subject视为生产者和消费者。 这就像一个开放的频道,有人可以在一端发送消息,任何订阅者都可以在另一端接收。

                                  +---------------
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);
  }
}

请注意messages getter将Subject作为Observable返回。 这不是必需的。 Subject已经是可观察的,任何人都可以直接订阅Subject 。 但我认为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自己的EventEmiiter实际上是一个Subject 。 当我们订阅EventEmitter ,我们订阅一个Subject ,当我们emitEventEmitter ,我们通过发送消息Subject为所有订户。


当你所在的代码是实际发起可观察数据的代码时,主题是有用的。 您可以轻松让您的客户订阅Subject ,然后调用next()函数将数据推送到管道中。

但是,如果您从其他源获取数据并将其传递(可能首先将其传递),那么您很可能想要使用此处显示的创建运算符之一,例如Rx.Observable.fromEvent ,如下所示:

var clicks = Rx.Observable.fromEvent(document, 'click');
clicks.subscribe(x => console.log(x));

这允许你留在功能范例中,而使用Subject ,虽然它有其用途,但有些人认为它是一种你试图强制命令式代码进入声明式框架的气味。

这是一个很好的答案,可以解释两种范式的不同之处。


你可以在这里找到对学科语义的研究。

我看到的所有答案都是正确的。 我只是补充说, subject这个术语来自观察者模式(参见https://en.wikipedia.org/wiki/Observer_pattern)。 由于这样一个主题是一种中继,它从一端接收一些内容,并在其任何一端(订阅)上发送它。

链接地址: http://www.djcxy.com/p/22881.html

上一篇: What are RxJS Subject's and the benifits of using them?

下一篇: why manipulating DOM in controller is a bad thing?