javascript - RxJS Subject 是什么以及使用它们的好处?

标签 javascript angular typescript rxjs subject

我找到了 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 Subject 的简单函数来理解它的重要性对我和其他人来说是最有帮助的?

谢谢!

最佳答案

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

                                  +---------------
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 方法保存发射。

现在有了这个服务,我们可以将它注入(inject)不同的组件,这可以成为两个(或更多)任意组件进行通信(或者只是接收任意事件通知)的一种方式。

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实际上是一个 Subject。当我们订阅 EventEmitter 时,我们订阅了一个 Subject,当我们在 EventEmitteremit 时,我们正在通过 Subject 为所有订阅者发送消息。

另见:

关于javascript - RxJS Subject 是什么以及使用它们的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39885264/

相关文章:

javascript - 如何检查何时按下字段输入/返回?

javascript - Angular 平均堆栈中的嵌套表

javascript - 如何将 Jquery/Bootstrap 文件包含到 Webpack/angular2/typescript 堆栈中

javascript - 从函数 A 中获取 JSON 并将其传递给 angular2 中的函数 B

node.js - 如何在 Angular 2 组件中初始化 Quill 编辑器?

php - 类似博客的条目方法

javascript - 通过 JavaScript 在 HTML 中正确编码变体选择器

javascript - 强制数字类型的文本字段将点显示为小数点分隔符

Angular 4 在两个列表中搜索

javascript - 无法解析 Angular 2 中 MapsPage :(? ,NavController,LaunchNavigator,.......) 的所有参数