【问题标题】:AngularJS/Ionic Service Factory CacheAngularJS/Ionic 服务工厂缓存
【发布时间】:2023-04-06 07:35:01
【问题描述】:

我正在尝试“缓存”我的 Angular 服务工厂。我希望它仅在第一次加载页面时使用缓存来访问 URL。然后,当我浏览到我的详细信息页面 (findById) 时,我想使用缓存。这有意义吗?

以下是我现在所拥有的,但我无法找到一种可靠的方法来处理这种异步。我的控制器正在调用服务。

angular.module('myapp.services', [])

.factory('myservice', function ($http, $q, $cacheFactory) {

    var url = '//myurl.com/getawesomeJSON';

    return {

        findAll: function () {

            var $httpDefaultCache = $cacheFactory.get('$http');

            var data = $httpDefaultCache.get(url);
            if (data == null) {
                data = $http.get(url, { cache: true });
            }

            var deferred = $q.defer();
            deferred.resolve(data);
            return deferred.promise;
        },

        findById: function (id) {

            var data = angular.fromJson($cacheFactory.get('$http').get(url)[1]);

            for (var i = 0; i < data.length; i++) {

                if (data[i].Id === parseInt(id)) {

                    var deferred = $q.defer();
                    deferred.resolve(data[i]);
                    return deferred.promise;
                }
            }
        }
    }
});

【问题讨论】:

    标签: angularjs ionic-framework angularjs-factory


    【解决方案1】:

    由于您没有提供 plunker,因此我没有对此进行测试,但以下内容应该会让您朝着正确的方向前进。您需要使用承诺链。

    angular.module('myapp.services', [])
    
    .factory('myservice', function ($http, $q, $cacheFactory) {
    
        var url = '//myurl.com/getawesomeJSON';
    
        return {
    
            findAll: function () {
    
                var $httpDefaultCache = $cacheFactory.get('$http');
    
                var deferred = $q.defer();
    
                var data = $httpDefaultCache.get(url);
                if (!data) {
                    $http.get(url, { cache: true }).then(function(result){
                        deferred.resolve(result);
                    });
                } else {
                    deferred.resolve(data);
                }
    
                return deferred.promise;
            },
    
            findById: function (id) {
               return this.findAll().then(function(data) {
                   for (var i = 0; i < data.length; i++) {
                      if (data[i].Id === parseInt(id)) {
                          return data[i];
                      }
                  }
                  return $q.reject('Not found'); // id not found
               });
            }
        }
    });
    

    【讨论】:

    • 拜尔斯感谢您的回复。但是我不希望我的 findById 函数也返回一个承诺吗?当我从控制器调用 findAll 时,需要使用“then”回调来处理它。但是,如果我调用 findById 它只会返回直接结果。我不应该保持一致吗?
    • @aherrick findById() 实际上是在返回一个承诺。这是一个简化版本来展示这一点:return this.findAll().then(......);。所以它返回了then(),而then() 本身返回了一个promise。所以调用findById() 会返回来自findAll().then() 的承诺。两个内部返回都在 then()successCallback 内,我们从文档中知道,这决定了应解决还是拒绝承诺。相关文档:This [then()] method returns a new promise which is resolved or rejected via the return value of the _successCallback_, _errorCallback_.
    • 我遇到的问题是,一旦数据被缓存,它就会以如下结果返回。当它没有被缓存时,它会以不同的方式返回。i.imgur.com/QaF0i1G.jpg
    • @aherrick 你能发一张不缓存的截图吗?
    猜你喜欢
    • 2013-04-20
    • 2015-11-25
    • 2023-03-08
    • 2014-11-30
    • 1970-01-01
    • 2014-05-02
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多