从Angular 6组件中考虑以下代码:
class AppComponent {
subject = new Subject<any>();
one = this.subject.pipe(share(), tap(e => log('one emits')));
two = this.one.pipe(tap(e => log('two emits')));
three = this.one.pipe(delay(500), tap(e => log('three emits')));
ngOnInit() {
this.two.subscribe(e => log('two received'));
this.three.subscribe(e => log('three received'));
this.subject.next();
}
}
执行ngOnInit
时,将记录以下内容:
一个发射
两次发射
两个收到
一个发射
三个发射
三个收到
我不明白:为什么one
会发射两次?管道中的share
操作符不应该让two
和three
订阅相同的共享源吗?
答案 0 :(得分:4)
share()
运算符在您使用时进行多播。因此,当您在tap
之前使用它时,tap
仍然有两个观察者。
因此,只需在share
之后使用tap
,它将维护其父项的一个订阅。
one = this.subject.pipe(tap(e => console.log('one emits')), share());