首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AngularJS和“智能”缓存

AngularJS和“智能”缓存
EN

Stack Overflow用户
提问于 2013-07-29 12:17:50
回答 1查看 1.6K关注 0票数 2

我想在我的应用程序中实现“智能”缓存。我希望始终首先从缓存返回数据(如果没有可用的空对象/数组),然后始终从服务器获取数据并用更新的服务器响应替换缓存的响应。目标是总是快速地向用户展示一些东西。我想以一种“棱角”的方式来做,也就是承诺的典范。

我找到了一个使用$resource服务(http://www.bennadel.com/blog/2432-Applying-A-Cached-Response-To-An-AngularJS-Resource.htm)的解决方案,但是如果您不使用它提供的4-5默认REST方法,$resource就会非常糟糕。它的自定义方法功能严重缺乏。我非常希望使用低级别的$http服务,因为它使我能够更好地控制请求,同时使控制器忽略整个缓存功能(即避免首先从控制器本身的缓存中获取数据,然后查询服务)。

有没有人处理过这个问题,有更好的解决办法?

谢谢:-)

EN

回答 1

Stack Overflow用户

发布于 2013-09-02 02:49:21

http://jsfiddle.net/G23h7/

我创建了两个服务来完成我认为您想要完成的任务。第一个提供了接收许诺和对象(或数组)的核心功能,并在承诺解决时更新所述对象或数组。这里有一个GUI供你玩。

第二个服务将其集成到$http中。基本上,您可以使用smartHttp.forArray(config)smartHttp.forObj(config)来代替$http(config)。如果您最终使用了这个方法,并且希望使用$http快捷方法,那么实现起来应该很简单。这是未经测试的-所以把它看作是伪码。如果您正在立即返回缓存的值/dud值,那么使用smartHttp服务返回值的承诺是没有意义的(除非您试图使该服务与$http可互换)。如果你希望这是一个承诺,或者任何你可以改变的原因:

代码语言:javascript
运行
复制
var general = function (obj, methodName) {
    // ...
    return obj;
};

以下各点:

代码语言:javascript
运行
复制
var general = function (obj, methodName) {
    // ...
    return $q.when(obj);
};

然后请求$q服务,当然。这里的真正问题是请求之间的平等--我认为$http很好地做到了这一点;我做了一个简单的键--您可能想要更改它(只要您有简单的请求/对所有我认为不重要的事情都有相同的顺序)。

代码语言:javascript
运行
复制
myApp.factory('smartCache', function () {
    var service = {};

    service.forArray = function (array, promise, clear) {
        promise.then(function (promiseResult) {
            if (clear) {
                array.length = 0;
            }

            angular.forEach(promiseResult, function (promiseResultElement) {
                array.push(promiseResultElement);
            });
        });
    };

    service.forObj = function (obj, promise, clear) {
        promise.then(function (promiseResult) {
            if (clear) {
                for (var prop in obj) {
                    delete obj[prop];
                }           
            }

            for (var prop in promiseResult) {
                obj[prop] = promiseResult[prop];
            }
        });
    };

    return service;
});

myApp.factory('smartHttp', function ($http, smartCache, $cacheFactory) {   
    var cache = $cacheFactory('smartHttp');

    var service = {};

    var general = function (config, methodName, initialValue) {
        var obj;
        var key = JSON.stringify([ config.url, config.method, config.params, config.data ]);
        var cachedObj = cache.get(key);
        if (cachedObj !== undefined) {
            obj = cachedObj;
        } else {
            obj  = initialValue;
        }

        var promise = $http(config);
        var smartCachePromise = promise.then(function (result) {
            return result.data;
        });
        smartCache[methodName](obj, smartCachePromise, true);

        return obj;
    };

    service.forObj = function (config) {
        return general(config, 'forObj', {});
    }

    service.forArray = function (config) {
        return general(config, 'forArray', []);
    }


    return service;
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17923815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档