angular - 将组件订阅到服务的 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 中了解到的情况,数组和对象是通过引用传递的,这在技术上就是我在这里所做的,但这是正确的决定吗?
我只想知道这是否被认为是最佳实践,如果不是,我应该如何去做?
谢谢!
解决方案
我不会将其保留Observable
为服务的属性;这与您提到的引用类型关系不大,而与Observable
一般的 s 设计关系更大。
你所做的不一定是坏事;但是,AnObservable
是仅在订阅时运行的合约。Observable
返回的是http.get
作为属性分配给您的服务的内容;如果它从未被订阅,则不会进行 http 调用......但如果三个组件订阅它Observable
,则会进行三个单独的 http 调用。
从的Observable
返回HttpClient
是一个冷的、有限的可观察的。这意味着它将发出一个单一的值,然后发送一个unsubscribe
信号。如果一个组件知道这一点并且只需要一次数据,为什么不直接返回Observable
created fromhttp.get
呢?这样,调用者可以在 上使用任意数量的Observable
运算符,而Observable
不会影响任何其他试图获得相同值的组件。
作为 Services 的属性(而不仅仅是在Observables
方法中返回新的)对于某些事情确实有意义,但Observables
它们通常不是Subjects
. 这就是 ngrx-store 状态管理背后的整个设计理念。但是对于冷的,有限Observables
的,只需返回Observable
给调用者。
推荐阅读
- python-3.x - Dash Plotly 中多个选项卡内的回调
- linux - 无法在 Ubuntu 20.04 上正确启动 Redis 服务器
- laravel - 更改模型返回数组结构
- node.js - 传递 npm devDependencies
- apache-spark - PySpark 数据帧在写入配置单元表时丢弃记录
- c - 表达式树的正确顺序横向但错误的后顺序横向
- php - 如何使用 Ratchet Bundle 访问 Symfony 中的会话变量?
- go - 无法在 Heroku 上部署 go 应用程序。Push 被拒绝,编译 Go 应用程序失败
- r - Eliminate duplicates based on conditions from several columns in R
- base64 - base64 无法识别 Windows 10