在组件中订阅observable或在服务中使用回调作为参数订阅它是否有任何显着差异?
组件
constructor(public dataService: DataService) {
this.dataService.getData()
.subscribe(users => {
this.user = users;
console.log(this.user);
});
服务
getData() {
return this.http.get(this.url)
.map(res => res.json())
}
VS
组件
constructor(public dataService: DataService) {
this.dataService.getData( callback => {
this.user = this.dataService.user;
});
服务:
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);
});
}
结果是相同的,所以除了更复杂的sintax之外,我并没有完全发挥作用。哪个是最好的方法?
答案 0 :(得分:7)
根据我的理解,它不被视为订阅服务的最佳做法。当您订阅一个可观察的(特别是热门观察者,因为他们不完整)时,它会创建一个订阅。如果您没有取消订阅订阅,使用异步管道或手动取消订阅,则可能会造成内存泄漏,从而降低应用程序的性能。但隐藏订阅也会阻止观察者被链接到其他可观察者以创建更多"反应性"应用。
在上面的示例示例中,我从不订阅服务并设置要观看的角度的公共属性。此外,它可能会导致更改检测问题以及其他问题,包括可维护性。
答案 1 :(得分:1)
您可以随心所欲地编写服务,但这取决于某些标准方式和要求
就像MVC架构一样,你可以在同一页面上完成所有工作,但你仍然可以在不同的模块中完成它,只是为了使它更具可读性并使其可靠
Angular2也是如此。
通过在不同的文件中编写服务,您可以将该服务设为全局或可由多个组件共享,如果您在组件中编写,则无法执行此操作。
如果您需要我的意见,请为服务单独制作文件并始终 在你的代码中编写代码,无论它只有一个服务(api / 功能),但将来当应用程序变大时,你会看到 那么好处。
始终从组件订阅,永远不从服务订阅
详细信息: Please Read
答案 2 :(得分:1)
它只是一种建筑风格。最好的方法是从组件订阅,因为有时您可能会面临一个场景,即在服务返回时对组件的成员执行某些操作。
例如,您可能希望在服务返回时关闭作为组件一部分的模态。
如果您订阅了该服务, 除非你明确地传递了一个引用,否则你将无法访问模态,它是组件的一部分,这显然不是一种优雅的方式。
如果您订阅了该组件, 你可以做任何事情,你可以在对数据进行某些操作之前/之后对组件的成员做任何事情。
此外,一个很好的比喻是,订阅食品配送服务。
您更喜欢哪个选项?
将您的电话号码提供给餐厅,并要求他们在食物准备好后立即给您打电话,或者在食物准备就绪时将它送到您的门口?
答案 3 :(得分:1)
订阅的位置因体系结构或您要解决的问题而异。许多应用程序将其数据存储在ngrx商店中,并订阅商店的reducer以获取数据。在这种情况下,服务将订阅http调用并在存储中调度数据。组件将从存储中获取数据。
比方说,您在一个视图中有4个组件,全部显示了国家/地区列表。如果其中一个重新获取国家/地区列表,则希望所有4个国家都具有更新后的响应。你会做什么?您将订阅http通话服务,并将数据放入您的行为主题中。
如果要在模板中进行订阅,则必须先订阅行为主体的可观察数据,然后才能将其推送到服务中。
如果您没有通过ngrx或行为主题或任何其他状态共享对象使用状态管理,则可以订阅component。
如果不需要非连续的可观察对象(例如http调用),则取消订阅是必需的,主要是在连续可观察的情况下(例如您对事件具有可观察的对象)。