RxJS Observables:为什么回调触发两次?

时间:2018-08-16 12:10:09

标签: angular rxjs rxjs6

从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操作符不应该让twothree订阅相同的共享源吗?

Source on Stackblitz

1 个答案:

答案 0 :(得分:4)

share()运算符在您使用时进行多播。因此,当您在tap之前使用它时,tap仍然有两个观察者。

因此,只需在share之后使用tap,它将维护其父项的一个订阅。

one = this.subject.pipe(tap(e => console.log('one emits')), share());