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

时间:2018-02-05 12:28:50

标签: angular observable

在组件中订阅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之外,我并没有完全发挥作用。哪个是最好的方法?

4 个答案:

答案 0 :(得分:7)

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

在上面的示例示例中,我从不订阅服务并设置要观看的角度的公共属性。此外,它可能会导致更改检测问题以及其他问题,包括可维护性。

答案 1 :(得分:1)

您可以随心所欲地编写服务,但这取决于某些标准方式和要求

就像MVC架构一样,你可以在同一页面上完成所有工作,但你仍然可以在不同的模块中完成它,只是为了使它更具可读性并使其可靠

Angular2也是如此。

通过在不同的文件中编写服务,您可以将该服务设为全局或可由多个组件共享,如果您在组件中编写,则无法执行此操作。

  

如果您需要我的意见,请为服务单独制作文件并始终   在你的代码中编写代码,无论它只有一个服务(api /   功能),但将来当应用程序变大时,你会看到   那么好处。

     

始终从组件订阅,永远不从服务订阅

详细信息: Please Read

答案 2 :(得分:1)

它只是一种建筑风格。最好的方法是从组件订阅,因为有时您可能会面临一个场景,即在服务返回时对组件的成员执行某些操作。

例如,您可能希望在服务返回时关闭作为组件一部分的模态。

如果您订阅了该服务, 除非你明确地传递了一个引用,否则你将无法访问模态,它是组件的一部分,这显然不是一种优雅的方式。

如果您订阅了该组件, 你可以做任何事情,你可以在对数据进行某些操作之前/之后对组件的成员做任何事情。

此外,一个很好的比喻是,订阅食品配送服务。

您更喜欢哪个选项?

将您的电话号码提供给餐厅,并要求他们在食物准备好后立即给您打电话,或者在食物准备就绪时将它送到您的门口?

答案 3 :(得分:1)

订阅的位置因体系结构或您要解决的问题而异。许多应用程序将其数据存储在ngrx商店中,并订阅商店的reducer以获取数据。在这种情况下,服务将订阅http调用并在存储中调度数据。组件将从存储中获取数据。

比方说,您在一个视图中有4个组件,全部显示了国家/地区列表。如果其中一个重新获取国家/地区列表,则希望所有4个国家都具有更新后的响应。你会做什么?您将订阅http通话服务,并将数据放入您的行为主题中。

如果要在模板中进行订阅,则必须先订阅行为主体的可观察数据,然后才能将其推送到服务中。

如果您没有通过ngrx或行为主题或任何其他状态共享对象使用状态管理,则可以订阅component。

如果不需要非连续的可观察对象(例如http调用),则取消订阅是必需的,主要是在连续可观察的情况下(例如您对事件具有可观察的对象)。

相关问题