Consider this code, from an Angular 6 component:
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();
}
}
When ngOnInit executes, this is what gets logged:
one emits
two emits
two received
one emits
three emits
three received
I don't understand: why does one emit twice? Shouldn't the share operator in its pipe make two and three subscribe to the same shared source?
Source on Stackblitz
The share() operator multicasts at the point you use it. So when you use it before tap then tap still has two observers.
So just use share after tap and it'll maintain one subscription to its parent.
one = this.subject.pipe(tap(e => console.log('one emits')), share());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With