我正在研究Angular 2 RxJs模式,我不明白行为主体和可观察者之间的区别。
从我的理解,行为主体是一个可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。这似乎是一个可观察的完全相同的目的。
什么时候可以使用Observable vs行为主题?在一个可观察的情况下使用行为主体是否有好处?反之亦然?
行为主体是一种主题,主题是一种特殊类型的可观察者,因此您可以像任何其他可观察者一样订阅消息。行为主体的独特特征是:
>行为主体需要一个初始值,因为它必须始终返回一个订阅值,即使它没有收到一个next()
>订阅后,返回主题的最后一个值。一个常规的observable只有在接收到onnext时才触发
>在任何时候,您可以使用getValue()方法在不可观察的代码中检索主题的最后一个值。
与观察者相比,主题的独特特征是:
>除了作为可观察者之外,它是一个观察者,所以你也可以发送值到主题,除了订阅。
此外,您可以使用行为主体上的asobservable()方法从行为主体获取可观察值。
可观察的是一般的,行为主体在技术上是可观察的子类型,因为行为主体是具有特定质量的可观察的。
行为主题示例:
// Behavior Subject // a is a 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 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()从常规和行为主体创建可观察值。只有不同的是你不能发送值到可观察使用next()方法。
在angular2服务中,我将使用数据服务的行为主体作为角度服务,通常在组件和行为主体之前初始化,以确保消耗服务的组件接收到最后更新的数据,即使没有新的更新,因为组件订阅此数据。