一尘不染

Angular服务应该有状态吗?

angularjs

最近,我和一些同事正在讨论AngularJS服务是否应具有状态。我们提出了一些反对和反对的论据,我想就此话题获得更多的想法和反馈。在我的搜索中,我发现了这一点,但似乎没有提及任何明确的最佳实践。在无客户端世界中,服务永远都不应保持状态,但是我开始认为它可能是客户端可以接受的,因为它是一个不同的问题。

服务保持状态的原因:

  1. 该服务不会被多个线程访问。每个浏览器都有其自己的服务实例。
  2. 允许服务仅保留其关心的状态,而不是将其存储在rootScope中。封装

服务无法保持状态的原因:

  1. 服务不再是幂等的。调用函数可能会更改状态,因此在基于服务状态进行调用时可能会产生不同的结果。
  2. 我认为总体而言,这将更易于测试。

解决“用于服务持有状态”部分中的#2的一种方法是在rootScope上设置一个appState对象,该对象包含应用程序的当前状态。然后,所有状态都将聚集在一个位置,然后您就可以在服务中从中提取所需的内容。我发现了这个,想知道


阅读 232

收藏
2020-07-04

共1个答案

一尘不染

在AngularJS中,服务是通过factory函数传入的。基本上,它们是可以包含某些状态的对象(例如,用于缓存或存储执行其动作所需的数据)。

一个可以兼顾拥有/不具有状态的弊端的好的解决方案是,当服务(可能实际上是功能)返回包含状态的对象时。

看一下该$http服务:您可以获取该服务调用的实例

var x = $http({url:'...'});

然后打电话给

var result = x.get() //actually `$http.get` is shortcut of this operation

与相同ngResource:使用服务,您将获得具有某种状态的对象,可以执行所需的操作。

因此,基本上,我认为这是最好的选择:从某一点上讲,通过将可以由操作修改的状态移动到单独的对象中(而不是存储在服务本身中,但可以在该对象中具有特定的状态)来避免“副作用”存储自定义信息(例如身份验证信息等)。

2020-07-04