tap()vs subscribe()设置一个类属性

问题描述 投票:12回答:2

我是rxjs的新手,只是想知道通过管道流并点击它来设置类属性是可以的,或者它应该在订阅中进行。对我来说无论哪种方式都有效,只是想知道是否可以按照我认为合适的方式做到这一点,或者有一些我不知道的事情。

打字稿代码演示两种方式:

export class ViewComponent implements OnInit {

  applicant = {};

  constructor(public route: ActivatedRoute, private store: Store<any>) {}

  ngOnInit() {
    this.route.paramMap.pipe(
      switchMap(params => this.store.select(state => state.applicants.entities[params.get('id')])),
      tap(applicant => this.applicant = applicant)
    ).subscribe();
  }
}

VS

export class ViewComponent implements OnInit {

  applicant = {};

  constructor(public route: ActivatedRoute, private store: Store<any>) {}

  ngOnInit() {
    this.route.paramMap.pipe(
      switchMap(params => this.store.select(state => state.applicants.entities[params.get('id')]))
    ).subscribe(applicant => this.applicant = applicant);
  }
}
angular typescript rxjs subscribe tap
2个回答
17
投票

好问题。在source code运营商的tap中,这个评论几乎总结了一下:

此运算符可用于调试Observables以获取正确的值或执行其他副作用。 注意:这与Observable上的subscribe不同。如果没有订阅do返回的Observable,Observer指定的副作用将永远不会发生。因此do只是监视现有的执行,它不会像subscribe那样触发执行。

您可以在tap中运行的任何副作用也可能放在subscribe区块中。 subscribe表示你主动使用源值的意图,因为它说“当这个观察值发出时,我想在applicants变量中保存它的值”。 tap操作符主要用于调试,但它可用于运行副作用。

一般来说,有利于subscribe块运行副作用,使用tap进行调试,但要注意tap可以做更多,如果你需要它。


8
投票

当您的观察者与其订阅者分开时,tap非常有用。如果你有一个公开observable的类,你可以使用tap来实现当有人正在监听observable时需要执行这个类的副作用。另一方面,当您从另一个类订阅它时,您可以使用subscribe从订阅者的角度实现副作用。

具有可观察性的类:

public dummyObservable: Observable<number> = from([1, 2, 3, 4, 5]).pipe(
  // Side effects, executed every time I emit a value
  // I don't know which side effects implements who subscribes to me
  tap( n => console.log("I'm emitting this value:", n) )
);

订阅类:

ngOnInit(): void {
  this.dummyService.dummyObservable.subscribe(
    // Side effects, executed every time I receive a value
    // I don't know which side effects implements the observable
    data => console.log("I'm receiving this value: ", data)
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.