0%

rxjs Subject和BehaviorSubject的区别

前面了解过SubjectBehaviorSubjectsubject的变体,具有类似的多播功能,不同的是,BehaviorSubject需要初始值,并且会在订阅时发出当前值。

一句话概括:Subject只是多播,不保留状态,但是我们可以使用BehaviorSubject来知道最后一个发出的值。

有时候我们需要一订阅就需要得到值,而不是当事件发生后才得到,那么这种情况就需要使用BehaviorSubject操作符。

初始化

BehaviorSubject在初始化的时候需要给一个默认的值:

1
const behaviorSub = new BehaviorSubject(0);

我们来添加一个订阅函数:

1
2
3
behaviorSub.subscribe(data => {
console.log('behavior subject: ', data);
});

打开控制台,在订阅就会获得到值:0

发出新值

BehaviorSubjectsubject的变种,BehaviorSubject具有subject的基本功能,我们可以使用next方法发出新的值:

1
behaviorSub.next(data);

我们可以创建一个定时器不断的发出值,当发出到第十个的时候就终止:

1
2
3
4
5
6
interval(1000).subscribe(data => {
behaviorSub.next(data);
if (data === 10) {
this.behaviorSub.complete();
}
})

获得最新的值

BehaviorSubject在发出新的值之后会保存这个新的值,我们可以通过getValue()方法来随时获取到这个“最新的值”:

1
behaviorSub.getValue();

和其他操作符的组合

在某种情况下,我们的页面需要等待多个Observable获得一次最新的值后才开始其他逻辑,这时候我们需要combineLastes操作符来合并这些Observable。这时候BehaviorSubject就派上用场了:

1
2
3
4
combineLast([
behaviorSubject1,
behaviorSubject2,
]).subscribe(res1, res2);