0%

rxjs 关于subject

Rxjs中的Subject是一种特殊的Observable,它允许将值传播到许多观察者。普通的Observable是单播的(每个订阅的Observable都拥有Observable的独立环境),但Subject是多播的。Subject就像是EventEmitters,它维护着许多听众的注册列表。

每个Subject都是一个可观察者(Observable)。给定一个Subject,你可以订阅它,提供一个Observable,它开始正常接收值。但是从Obserable的角度来看,它无法判断Observable执行是来自简单的单播Observable还是Subject。它既然是观察者,那么Subject是一个对象,并且具有方法next(v)error(e)complete()。要向Subject提供新的值,那么只需要调用next(v),这个值江北多播到已注册的观察者以监听这个Subject。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import {Subject} from 'rxjs';
this.subject = new Subject<string>();
this.subject.subscribe(res => {
console.log('a ', res);
});
this.subject.subscribe(res => {
console.log('b ', res);
});
this.subject.next('test1');
this.subject.next('test2');
// 输出:
// a test1
// b test1
// a test2
// b test2

我们创建了一个Subject,然后添加了两订阅函数,并且发出了一些值,可以看到,发出的值通过Subject被多播到了每一个订阅函数。

由于SubjectObservable,这也意味着我们可以提供Subject作为任何Observablesubscribe参数,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
this.subject = new Subject<number>();
this.subject.subscribe(res => {
console.log('a ', res);
});
this.subject.subscribe(res => {
console.log('b ', res);
});
const observable = from([1, 2, 3]);
observable.subscribe(this.subject);
// 输出:
// a 1
// b 1
// a 2
// b 2
// a 3
// b 3

这样,我们可以通过Subject将单播Observable转换为多播。Subject也是唯一可以将Observable的执行共享给多个Obserfable的方法。

还有一些特殊类型的SubjectBehaviorSubjectReplaySubjectAsyncSubject

参考文章:https://rxjs-dev.firebaseapp.com/guide/subject