当前位置: 首页 > 面试题库 >

Angular服务应该有状态吗?

姜松
2023-03-14
问题内容

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

服务保持状态的原因:

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

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

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

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


问题答案:

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

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

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

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

然后打电话给

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

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

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



 类似资料:
  • 示例: state state 是另外一个元数据。 如果你在元数据中设置了state=inactive, 客户端将不能访问这些服务,即使这些服务是"活"着的。 你可以使用临时禁用一些服务,而不是杀掉它们, 这样就实现了服务的降级。 server. 你可以通过 rpcx-ui)来时实现禁用和启用的功能。 ```go server.go func main() { flag.Parse() go cr

  • 本文向大家介绍Angular 2 有状态管道,包括了Angular 2 有状态管道的使用技巧和注意事项,需要的朋友参考一下 示例 Angular 2提供了两种不同类型的管道-无状态管道和有状态管道。默认情况下,管道是无状态的。但是,我们可以通过将pure属性设置为来实现有状态管道false。如您在参数部分所看到的,您可以指定aname并声明管道是否应为纯管道,这意味着有状态或无状态。尽管数据流经一

  • 我无意中发现了一种非常普遍的做法。我甚至发现了一个网页,给它起了个名字,但我忘了名字,在谷歌上再也找不到那个网页了。 实践是,来自REST服务的每个JSON响应都应该具有以下结构: 或在错误情况下: 我的问题:JSON中为什么需要这样一个“status”属性?在我看来,这就是HTTP状态码的用途。 REST使用客户端和服务器之间的HTTP通信方式,例如,删除应该使用“DELETE”动词。同理,一个

  • 订单状态同步服务 简介 为及时获取订单状态和信息,用于对员工或用户的用车权限进行管控或对账,滴滴提供订单状态同步服务。订单状态同步需由订单状态回调和轮询同时进行。 说明 接入方可以在管理中心的应用详情中开启应用的回调服务,请务必配置有效的回调地址。当产生需要通知回调的场景时,滴滴侧服务端将进行回调。 收到回调通知后,请按照规定返回回调结果。通过该接口获取订单的最新信息。建议记录在本地数据库中,供后

  • 我在我们的应用程序中使用了和。在本地精简服务器和正式服上一切正常,除了在我们的正式生产环境中弹出一条错误消息: 加载资源失败:服务器响应状态为504(网关超时) 调查ngsw工作者。jsscript我找到了上面生成错误消息的行(后面2466行): catch中的控制台日志记录错误会导致以下错误: 一个似乎与此问题相关的错误:是什么导致未能在“ServiceWorkerGlobalScope”上执行

  • 我想知道Heroku服务器状态,找不到任何关于这个主题的留档。 示例: 任何人都可以解释这个例子吗?在哪里可以找到资源以供将来参考?