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

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

你什么时候会用ObservableBehaviorSubject?使用BehaviorSubjectObservable有好处吗?反之亦然?

推荐答案

BehaviorSubject是一种主题,主题是一种特殊类型的可观察对象,所以你可以像其他任何可观察对象一样订阅消息.行为主体的独特特征是:

  • 它需要初始值,因为它必须始终在订阅时返回值,即使它没有收到next()
  • 订阅后,它返回主题的最后一个值.一个常规的可观察到的只有当它收到一个onnext
  • 在任何时候,您都可以使用getValue()方法检索不可见代码中主题的最后一个值.

与可观察对象相比,对象的独特特征包括:

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

此外,您可以使用BehaviorSubject上的asObservable()方法从行为主体获得一个可观察值.

Observable是泛型,而BehaviorSubject从技术上讲是可观察对象的子类型,因为BehaviorSubject是具有特定属性的可观察对象.

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常规主题:

// 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两者创建可观测对象.

唯一的区别是您不能使用next()方法将值发送到可观察对象.

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

Javascript相关问答推荐

布局样式在刷新时不持续

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

提交表格后保留Web表格中的收件箱值?

GrapeJS -如何保存和加载自定义页面

当试图显示小部件时,使用者会出现JavaScript错误.

CheckBox作为Vue3中的一个组件

在react JS中映射数组对象的嵌套数据

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

Eval vs函数()返回语义

如何发送从REST Api收到的PNG数据响应

使用VUE和SCSS的数字滚动动画(&;内容生成)

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

使用类型:assets资源 /资源&时,webpack的配置对象&无效

令牌JWT未过期

更改agGRID/Reaction中的单元格格式

在ChartJS中使用spanGaps时,是否获取空值的坐标?

我如何才能获得价值观察家&对象&S的价值?

需要刷新以查看Mern堆栈应用程序中的更改

如何调整下拉内容,使其不与其他元素重叠?