角度服务缓存

Angular service cache

本文关键字:缓存 服务      更新时间:2023-09-26

我正试图将$http的响应缓存到angular会话的对象中,因此一旦进行了初始调用,每隔一次对service.getCategories()(例如)的调用都会从对象而不是api中获取数据。

正在路由上解析服务,但存在身份验证,身份验证将重定向到另一个路由-再次调用service.getCategories()。

我试图通过在调用时设置一个init变量来实现这一点,然后所有其他调用都将直接指向填充的对象——但它似乎以某种方式重置了服务,返回的对象被填充了两次,所以所有东西都是双倍的。见下文:

var $ = require('jquery');
module.exports = angular.module('app.common.services.category', [])
  .factory('categoryService', ['$http', '$q', '$rootScope', function($http, $q, $rootScope) {
// API Parameters
var deferred = $q.defer();
// Services
var Categories = {
  init: false,
  categories: [],
  index: 0,
  // Retrieve all data on load.
  // Loaded into an array for all other services
  // to use after init.
  getCategories: function(page) {
    if(!Categories.init) {
      $http.get('api/core/get_category_index')
           .then(function(result) {
        var data = result.data.categories;
        $.each(data, function(i, category) {
          category.index = Categories.index;
          Categories.categories.push(category);
          Categories.index++;
        });
        Categories.init = true;
        return deferred.resolve(Categories.categories);
      });
      // Return promise once catgories is resolved
      return deferred.promise;
    } else {

      return Categories.categories;
    }
  },
  allCategories: function() {
    return Categories.categories;
  }
}
return Categories;
}]);

您的方法的一个问题是,当第二次调用服务函数getCategories时,第一次服务器请求可能无法解决,从而导致第二次对服务器的调用。因此,应该将init标志直接移动到函数调用getCategories之后。

另一个问题是,在您的情况下,您不知道函数是返回promise还是返回Array。我建议始终返回阵列

module.exports = angular.module('app.common.services.category', [])
.factory('categoryService', ['$http', '$q', '$rootScope', function($http, $q, $rootScope) {

//API参数var递延;

//服务var类别={

        categories: [],
        index: 0,
        // Retrieve all data on load.
        // Loaded into an array for all other services
        // to use after init.
        getCategories: function(page) {
            if(!deferred) {
               // replacement for intit flag
                deferred = $q.defer();
                $http.get('api/core/get_category_index')
                    .then(function(result) {
                        var data = result.data.categories;
                        $.each(data, function(i, category) {
                            category.index = Categories.index;
                            Categories.categories.push(category);
                            Categories.index++;
                        });

                        deferred.resolve(Categories.categories);
                    });

            }
             // always return a promise
             return deferred.promise;

        },
        allCategories: function() {
            return Categories.categories;
        }
    }
    return Categories;
}]);

也许你可以用承诺来回报服务本身。然后你可以到处写一些东西,比如:

myService.load().then(
 function success(theService) {
    theService.allCategories()
 }
);

现在,服务是否在之前加载已经无关紧要了