首页 > 解决方案 > 将组件订阅到服务的 observable 时的最佳实践是什么?[角度 2+]

问题描述

我正在构建一个从 YouTube 获取视频数据的应用程序。

不同的解决方案有很多资源,但是在为组件订阅服务时,是否有一种被认为是最佳实践的方法?

到目前为止,这是我所拥有的:

// Component
export class LandingYoutubeComponent implements OnInit {

      constructor(private youtube: YoutubeService) { 
      }

      ngOnInit() {
        this.youtube.getVideos().subscribe(data => console.log(data));
      }
    }

// Service
export class YoutubeService {

  videoSubscription: Observable<any>;
  API_KEY: string = 'someKey';
  CHANNEL_ID: string = 'someID';
  configUrl: string = `https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=${this.CHANNEL_ID}&maxResults=50&order=date&type=video&key=${this.API_KEY}`

  constructor(private http: HttpClient) {
    this.videoSubscription = this.http.get(this.configUrl);  //  create observable for external subscriptions
  }

  getVideos() {
    return this.videoSubscription;
  }
}

组件和服务都是相互抽象的,都粘贴了各个类封装的逻辑。

根据我从 JS 中了解到的情况,数组和对象是通过引用传递的,这在技术上就是我在这里所做的,但这是正确的决定吗?

我只想知道这是否被认为是最佳实践,如果不是,我应该如何去做?

谢谢!

标签: angularasynchronousangular-servicesangular-componentsangular-observable

解决方案


我不会将其保留Observable为服务的属性;这与您提到的引用类型关系不大,而与Observable一般的 s 设计关系更大。

你所做的不一定是坏事;但是,AnObservable是仅在订阅时运行的合约。Observable返回的是http.get作为属性分配给您的服务的内容;如果它从未被订阅,则不会进行 http 调用......但如果三个组件订阅它Observable,则会进行三个单独的 http 调用。

从的Observable返回HttpClient是一个冷的、有限的可观察的。这意味着它将发出一个单一的值,然后发送一个unsubscribe信号。如果一个组件知道这一点并且只需要一次数据,为什么不直接返回Observablecreated fromhttp.get呢?这样,调用者可以在 上使用任意数量的Observable运算符,而Observable不会影响任何其他试图获得相同值的组件。

作为 Services 的属性(而不仅仅是在Observables方法中返回新的)对于某些事情确实有意义,但Observables它们通常不是Subjects. 这就是 ngrx-store 状态管理背后的整个设计理念。但是对于冷的,有限Observables的,只需返回Observable给调用者。


推荐阅读