Angular服务:观察者模式的最佳实践

3
我是一名能翻译文本的助手。
我正在从 Angular 的基础知识过渡到学习更多关于最佳实践的内容。我最近开始尝试采用更具响应性的方法,但是有一件事情我在谷歌上搜索仍未找到好的答案。
现在,我们可以在服务中编写以下简单的方法:
   public getSomething(): Observable<Something>
   {
      return this._http.get("api path")
   }

因此,在调用组件中,我们可以订阅并在更改流时收到通知。但是如果应用程序中有多个部分应该被通知到这个变化怎么办?

作为替代方案,我们可以做以下操作:

   private _somethingSubject: Subject<Something> = new Subject<Something>();
   public someThing$: Observable<Something> = this._somethingSubject.asObservable(); 

   public getSomething()
   {
      return this._http.get("api path")
         .subscribe((something) => { this._somethingSubject.next(something) }) 
}

现在,任何服务的消费者都可以听取something$的变化。但当然,你现在需要知道“detached”流和所调用方法之间存在连接。
似乎大多数教程都采用第一种方法,但这真的是响应式编程吗?什么是最好的解决方案?
1个回答

3
您的第二种方法对于您描述的用例肯定是有效的。据我经验,大多数教程要么只涵盖基础知识(即您的第一种方法),要么比您的第二种方法更进一步,通过实现像 NgRx 这样的状态管理库。
NgRx - 状态管理
使用状态管理库(NgRx 可能是您最佳选择,因为它得到了 Google 的支持)在构建响应式应用程序时可以被认为是最佳实践。
本质上,您获得的好处是一个集中化的数据存储,每个组件或服务都可以订阅该存储。有点像您在服务中创建的 subject 场景——只不过范围更大,不仅限于一个服务。
为什么考虑使用 NgRx 而不是共享服务?
Redux - NgRx 实际上是 Angular 对 Redux 模式的实现。简单地概括一下,Redux 模式是:
  • 一个集中存储所有状态的地方
  • 一个集中的地方(您的Reducers),负责更改状态
    • 您的状态是不可变的
    • 只有某人调度所谓的操作,您的reducer函数才能被触发

那么这些要点有什么好处呢?当您在应用程序中拥有非常严格和标准化的管理状态的方式时,调试变得更加容易,因为您知道状态只能在一个单一的位置被修改。

使您的应用程序具有响应性也变得更加容易,因为您的所有实现都可以访问相同的存储区(您可以分割存储区,但这是另一个主题)。

以下是一些关于此主题的非常好的教程:


好的回答。但是你能否列举出使用ngrx相对于使用简单的公共服务存储所有可以在应用程序中使用的标志的优点?它们都可以在整个应用程序中访问,都是单例模式,都很容易。我只是好奇。 - eko
1
@echonax - 当然,我会多写几个字的 :) - Fredrik Lundin
谢谢。知道我的第二个例子确实是一种可接受的方法,这才是我想要的。就ngrx而言,我已经研究了它很多,但在我的当前项目中选择了退出。即使是ngrx开发人员自己也说,这并不适用于每个项目。我觉得有点太过隆重。减少器、操作、副作用等等。似乎需要很多代码来启动状态。 - Andreas Korsvold Kristensen
1
@echonax - 我写了一些关于NgRx和Redux的内容。请参考链接获取更多信息。 - Fredrik Lundin
@AndreasKorsvoldKristensen - 当然,NgRx确实带有很多样板代码,对于小型和不太复杂的项目来说可能会显得冗长。就像你所说的,它绝对不适用于每个项目。至少了解一下是很好的,这样你就可以考虑它 - 就像你所做的那样。祝你编码顺利! :) - Fredrik Lundin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接