多次调用相同的服务,设计不好的标志?

时间:2015-08-01 13:33:12

标签: javascript angularjs

我正在构建一个相当大的Angular应用程序,而且我一直坚持建设“瘦身”的设计。控制器。我的控制器不会尝试做太多,他们每个人都专注于我的应用程序中的一项功能。

然而,某些数据是“共享”的。控制器之间。我的目标是避免使用$rootScope,而是依靠服务来共享数据和“状态”。

查看“网络”时Chrome开发者工具的标签我注意到某些服务被调用了六次。所以我的问题是,这是一个糟糕的设计吗?在Angular应用程序中多次调用同一服务而不是' Angular方式'做事吗?注意:这些服务调用每个需要大约20毫秒,所以到目前为止显然没有太大的性能影响。

4 个答案:

答案 0 :(得分:1)

我建议减少您所做的不必要的HTTP请求数量,原因有两个:

  1. 在生产环境中,当考虑网络延迟或服务器负载等因素时,这些HTTP请求可能需要更长时间才能完成;以及

  2. 会延迟加载任何其他资源,例如图像(假设它们来自同一个域)。

  3. 我在处理您所描述的方案时使用的方法是缓存服务中API的响应/数据。因此,在后续调用服务时,可以从缓存而不是API中提取数据。

    请参阅下面的简短示例:

    angular.module('app', ['ngResource'])
    
    .factory('Post', ['$resource', function($resource) {
    
      var posts = [];
    
      var service = {
        all: all
      }
    
      return service;
    
      function all() {
        // if cached posts exist, return those. Otherwise, make call to external API.
        if (posts.length > 0) {
          return posts.$promise;
        } else {
          posts = $resource('http://localhost/api/v1/posts.json').query();
          return posts.$promise;
        }
      }
    
    }]);
    

    注意:您还必须考虑重置缓存,但这取决于您的应用程序逻辑。

    希望这有帮助!

    L

答案 1 :(得分:0)

在这种情况下,您应该使用$cacheFactory来减少服务呼叫。

答案 2 :(得分:0)

您在谈论REST服务吗?您是否进行$ http调用以在控制器之间共享数据和状态?

为什么不在Angular中使用service/factory

答案 3 :(得分:0)

你需要的是什么 1. DataCache服务/工厂 - 它将存储您的服务器响应
2.指令 - 调用这些服务。将它包含在您的不同视图中 3.现在在您的服务中负责进行http调用首先检查数据是否在缓存中是否可用如果是,则返回存储数据的承诺(如果不进行服务调用,则可以使用$ q.when)。

  

我已经提到过第2点,因为我在你的各种控制器中假设你必须做像AbcFactory.getItem()。then()这样的事情,以避免重复这段代码,因为你永远不知道什么时候需求会改变,因为改变是在开发期间仅保持不变;)