最近的一些同事和我有一个讨论,以AngularJS服务是否应该有状态或没有。 我们想出了一些支持和反对它,我想获得关于这个问题更多的想法和反馈。 在我的搜索,我发现这个 ,但似乎并没有被提及任何明确的最佳实践。 在没有客户端的世界服务不应该保持状态,但我开始认为这是可以接受的客户端,因为它是一个不同的问题。
为保持状态服务的原因:
- 该服务是不会被多个线程访问。 每个浏览器都有其自己的服务的一个实例。
- 允许保持状态的服务只关心它存放在rootScope约代替。 包囊
原因服务不能保持状态:
- 服务不再是幂等。 调用函数可以改变状态,因此基于服务的状态时调用它可能有不同的结果。
- 我认为,总体而言,这将是更容易测试。
可能的“为服务保持状态”一节中讨论#2的一种方式将是对包含应用程序的当前状态rootScope设置APPSTATE对象。 然后,所有国家将在一个地方聚集,然后你只是拉你需要什么,出来的和你的服务。 我发现这个,不知道
在AngularJS,服务是通过工厂函数传递 。 基本上,他们是可以包含一些国家(例如,用于缓存或存储需要执行自己的行为数据)的对象。
可以采取有两个缺点一个很好的解决方案/没有状态是当服务(这可能是实际函数)包含状态返回的对象。
看看在$http
服务:你可以得到这个服务调用的实例
var x = $http({url:'...'});
然后调用
var result = x.get() //actually `$http.get` is shortcut of this operation
同样的, ngResource
:使用服务你得到的是能够执行所需操作的一些状态对象。
所以基本上我认为这是最好的选择:从一个点你避免“副作用”,通过移动可以通过行动统一到单独的对象,而不是存储在服务本身进行修改状态,但可以有特定状态的那个对象能够存储自定义信息(如身份验证信息等)。
或许,这将取决于你所说的“状态”是什么,但在许多情况下,我认为答案是肯定的:服务必须保持状态。
举例来说,如果你有一个服务,是负责与API通信,该服务能不能把认证状态。
顺便说一句,我不知道有多少幂等事项AngularJS服务 - 他们是单身,因此本身具有一定的状态。 你可以(在某些情况下必须)创建服务幂等方法,但是这是一个单独的问题。
IMO是的,服务也有状态。 我说“可以”作为一个服务可以被认为是类似的东西经典的无客户端的服务 - 供应商,但它也意味着完全不同的东西,在angularJS。 由于在相同的应用程式rootScope-Y的一个实例的元素,它可以单独使用,管理国家,例如。 在我的情况下,使我能够确保固态结构在许多应用程序一样,尽管他们各自的国家结构为每个引导中定义的,像会话状态总是相同的,更新的,当该模块被改变。
该服务不应该有状态的原因是,它会导致竞争条件,当你有多个线程访问该服务。
在服务与状态的一个常见问题是:
- 线程1写到状态
- 线程2写入状态
- 线程1从状态读取
- 线程2从状态读取
线程1现在有错误的值。
话虽这么说,JavaScript是目前单线程所以你不会有这样的线程访问的问题。 但是,如果我有一个服务,其中多个异步$ HTTP调用都写同样的服务可变我会担心。 如果只有这样我就可以睡得更好晚上我,我会努力让他们道直通实际数据写我所有的服务方法。
相反,在服务维修器材的状态,你可以考虑把状态在后端尽可能多地。 像“身份验证”,甚至宽度和高度的东西就可以维持,并查询了。 这可以开放一些的可能性,允许用户浏览,离开这个程序,回来后发现他们所有的喜好仍然设置和登录。你可以存储会话ID的Cookie,并保存在后端所有这些东西。
如果你没有去有一个单独的对象来存储状态的路线,当东西的状态发生了变化,你也许能够从$服务发出它如何发出从工厂事件 。 这将有有多个服务能够修改一个统一的应用状态,因为状态不被存储在任何一个服务(或多个服务之间更糟糕摊开)的漂亮的副作用。