我正在研究Angular RxJs模式,但不了解a BehaviorSubject和an 之间的区别Observable。
根据我的理解,a BehaviorSubject是可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。这似乎与的目的完全相同Observable。
什么时候使用Observablevs BehaviorSubject?在那里使用效益BehaviorSubject上的Observable,反之亦然?
BehaviorSubject是主题的一种,主题是可观察的特殊类型,因此您可以像其他任何可观察对象一样订阅消息。BehaviorSubject的独特功能是:
它需要一个初始值,因为即使未收到订阅,它也必须始终返回订阅的值。 next()订阅后,它将返回主题的最后一个值。常规可观察对象仅在收到onnext在任何时候,您都可以使用getValue()方法以不可观察的代码检索主题的最后一个值。与可观察对象相比,对象的独特特征是:
它不仅是可观察者,而且是观察者,因此您除了订阅它之外,还可以将值发送给主题。此外,您可以使用上的asObservable()方法从行为主体中获得可观察的结果BehaviorSubject。
Observable是通用的,BehaviorSubject从技术上讲是Observable的子类型,因为BehaviorSubject是具有特定质量的Observable。
具有BehaviorSubject的示例:
// Behavior Subject// a is an initial value. if there is a subscription // after this, it would get "a" value immediatelylet 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 cbSubject.next("d"); // Subscription got d
// 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:
// Regular Subjectlet 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 csubject.next("d"); // Subscription got d
// 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和两者创建可观察对象。BehaviorSubjectsubject.asObservable()
唯一的区别是您不能将值发送给可观察的using next()方法。
在Angular服务中,我将使用BehaviorSubject数据服务,因为Angular 服务通常在组件和行为主体确保使用该服务的组件接收到最后更新的数据之前就进行初始化,即使自组件订阅该数据以来没有新的更新也是如此。