BehaviorSubject与Observable? [英] BehaviorSubject vs Observable?
问题描述
我正在研究Angular RxJs模式,但我不理解BehaviorSubject
和Observable
之间的区别.
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
.
您何时会使用Observable
与BehaviorSubject
?在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()
,它也必须始终在订阅时返回一个值
- 订阅后,它返回主题的最后一个值.常规可观察对象仅在收到
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()
方法从行为主体中获得可观察到的信息.
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()
从Subject
和BehaviorSubject
创建可观察对象.
An observable can be created from both Subject
and BehaviorSubject
using subject.asObservable()
.
唯一的区别是您无法使用next()
方法将值发送给可观察对象.
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与Observable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!