可观察:订阅组件和服务中的数据有什么区别?

Mel*_*lle 6 observable angular

订阅组件中的observable或者使用回调作为参数在服务中订阅它是否有任何显着差异?

零件

constructor(public dataService: DataService) {
     this.dataService.getData()
     .subscribe(users => {
      this.user = users;
      console.log(this.user);
     });
Run Code Online (Sandbox Code Playgroud)

服务

getData() {    
    return this.http.get(this.url)
      .map(res => res.json())
       }
Run Code Online (Sandbox Code Playgroud)

VS

零件

constructor(public dataService: DataService) {
    this.dataService.getData( callback => {
      this.user = this.dataService.user;
    });
Run Code Online (Sandbox Code Playgroud)

服务:

 getData(callback: (receiver: User) => void) {
    return this.http.get(this.url)
      .map(res => res.json())
      .subscribe(users => {
        this.user = users;
        callback(this.user);
        console.log(this.user);
      });
  }
Run Code Online (Sandbox Code Playgroud)

结果是相同的,所以除了更复杂的sintax之外,我没有太大的区别.哪个是最好的方法?

Jos*_*mer 7

根据我的理解,订阅服务并不是最佳做法.当您订阅一个observable(特别是一个hot observable,因为它们没有完成)时,它会创建一个订阅.如果您没有取消订阅订阅,使用异步管道或手动取消订阅,则可能会造成内存泄漏,从而降低应用程序的性能.但隐藏订阅还会阻止observable被链接到其他可观察对象以创建更多"反应性"应用程序.

在上面的例子中,我永远不会在服务中订阅,并设置一个公共属性for angular to watch.此外,它可能会导致更改检测问题以及其他问题,包括可维护性.

  • @theOriginalJosh比接受的答案好得多.好解释. (2认同)