BehaviorSubject vs Observable? [英] BehaviorSubject vs Observable?

查看:25
本文介绍了BehaviorSubject vs Observable?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究 Angular RxJs 模式,但我不明白 BehaviorSubjectObservable 之间的区别.

I'm looking into Angular RxJs patterns and I don't understand the difference between a BehaviorSubject and an Observable.

根据我的理解,BehaviorSubject 是一个可以随时间变化的值(可以订阅并且订阅者可以接收更新的结果).这似乎与 Observable 的目的完全相同.

From my understanding, a BehaviorSubject is a value that can change over time (can be subscribed to and subscribers can receive updated results). This seems to be the exact same purpose of an Observable.

什么时候使用 ObservableBehaviorSubject?在 Observable 上使用 BehaviorSubject 是否有好处,反之亦然?

When would you use an Observable vs a BehaviorSubject? Are there benefits to using a BehaviorSubject over an Observable or vice versa?

推荐答案

BehaviorSubject 是一种主题,主题是一种特殊类型的可观察对象,因此您可以像订阅任何其他可观察对象一样订阅消息.BehaviorSubject 的独特之处在于:

BehaviorSubject is a type of subject, a subject is a special type of observable so you can subscribe to messages like any other observable. The unique features of BehaviorSubject are:

  • 它需要一个初始值,因为它必须始终在订阅时返回一个值,即使它没有收到 next()
  • 订阅后,它返回主题的最后一个值.常规 observable 仅在收到 onnext
  • 时触发
  • 在任何时候,您都可以使用 getValue() 方法在不可观察代码中检索主题的最后一个值.
  • It needs an initial value as it must always return a value on subscription even if it hasn't received a next()
  • Upon subscription, it returns the last value of the subject. A regular observable only triggers when it receives an onnext
  • at any point, you can retrieve the last value of the subject in a non-observable code using the getValue() method.

与可观察对象相比,主题的独特之处在于:

Unique features of a subject compared to an observable are:

  • 除了作为可观察对象之外,它还是一个观察者,因此除了订阅主题之外,您还可以向其发送值.

此外,您可以使用 BehaviorSubject 上的 asObservable() 方法从行为主体中获取 observable.

In addition, you can get an observable from behavior subject using the asObservable() method on BehaviorSubject.

Observable 是一个泛型,而 BehaviorSubject 在技术上是 Observable 的一个子类型,因为 BehaviorSubject 是一个具有特定品质的 observable.

Observable is a Generic, and BehaviorSubject is technically a sub-type of Observable because BehaviorSubject is an observable with specific qualities.

BehaviorSubject 示例:

// Behavior Subject

// a is an initial value. if there is a subscription 
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a"); 

bSubject.next("b");

bSubject.subscribe(value => {
  console.log("Subscription got", value); // Subscription got b, 
                                          // ^ This would not happen 
                                          // for a generic observable 
                                          // or generic subject by default
});

bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d

带有常规主题的示例 2:

Example 2 with regular subject:

// Regular Subject

let subject = new Subject(); 

subject.next("b");

subject.subscribe(value => {
  console.log("Subscription got", value); // Subscription wont get 
                                          // anything at this point
});

subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d

可以使用 subject.asObservable()SubjectBehaviorSubject 创建 observable.

An observable can be created from both Subject and BehaviorSubject using subject.asObservable().

唯一的区别是您不能使用 next() 方法向 observable 发送值.

The only difference being you can't send values to an observable using next() method.

在 Angular 服务中,我将 BehaviorSubject 用于数据服务,因为 Angular 服务通常在组件和行为主体之前初始化,确保使用该服务的组件接收到最后更新的数据,即使没有自组件订阅此数据以来的新更新.

In Angular services, I would use BehaviorSubject for a data service as an angular service often initializes before component and behavior subject ensures that the component consuming the service receives the last updated data even if there are no new updates since the component's subscription to this data.

这篇关于BehaviorSubject vs Observable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆