RxJS中的订阅是什么,可观察对象如何与它们交互?

时间:2018-08-24 15:19:39

标签: angular rxjs angular2-observables

我对可观察对象和订阅的工作方式不清楚。特别是Observable及其订阅如何交换信息。

因此要提出明确的问题:

  • Observable是否保留对其订阅的引用?
  • 订阅是否保留对创建它的Observable的引用?
  • 可观察项是否在其订阅中“放入”数据,或者订阅是否对其可观察项进行“轮询”?
  • 信息交换是如何发生的?

2 个答案:

答案 0 :(得分:2)

Subscription是将Observer添加到Observable的结果。该对象只能用于该Observable中的unsubscribe。取消订阅后,观察者将不会再收到任何辐射。

调用Observer时将创建Observable.subscribe(next, error, complete)(您可能将其称为“订阅”)。使用Observer实现自己的Observable时,您将收到Observable.create()。否则,您将无法获得它。观察者拥有next(value => void)error(error => void)complete(_ => void)函数,这些函数被Observable用来传达状态变化。

信息交换仅在一个方向上进行。可观察对象总是向观察者发出,反之亦然。

现在提出您的问题:

  

Observable是否保留对其订阅的引用?

不,它保留对其Observers的引用,但这可能就是您的意思。

  

订阅是否保留对创建它的Observable的引用?

否,只有用于取消订阅该Observable的函数。 Observer也没有对其已订阅的Observable的引用。

  

可观察的数据是否在其订阅中“放置”数据,或者订阅是否对其可观察的对象进行“轮询”?

Observers的可观察的“ puts”(更好的词为“ emits”)值。来自Observable的从不进行任何轮询,因为这会违反RxJS的基本原理。 BehaviourSubject.getValue()是一个例外,但是在大多数情况下,您不应该使用它!

  

信息交换是如何发生的?

这取决于Observable。通常,Observable保留其所有Observers的列表,并在发出新值时调用其next()函数,在发生错误时调用error()函数,而{{ 1}}达到完整性状态时起作用。

答案 1 :(得分:1)

基本上,您的问题与更一般的观察者模式有关,这是一篇有关此内容的好文章 JS example或更通用的example,您将获得所有答案。