我想在我的应用程序中实现“智能”缓存。我希望始终首先从缓存返回数据(如果没有可用的空对象/数组),然后始终从服务器获取数据并用更新的服务器响应替换缓存的响应。目标是总是快速地向用户展示一些东西。我想以一种“棱角”的方式来做,也就是承诺的典范。
我找到了一个使用$resource服务(http://www.bennadel.com/blog/2432-Applying-A-Cached-Response-To-An-AngularJS-Resource.htm)的解决方案,但是如果您不使用它提供的4-5默认REST方法,$resource就会非常糟糕。它的自定义方法功能严重缺乏。我非常希望使用低级别的$http服务,因为它使我能够更好地控制请求,同时使控制器忽略整个缓存功能(即避免首先从控制器本身的缓存中获取数据,然后查询服务)。
有没有人处理过这个问题,有更好的解决办法?
谢谢:-)
发布于 2013-09-02 02:49:21
http://jsfiddle.net/G23h7/
我创建了两个服务来完成我认为您想要完成的任务。第一个提供了接收许诺和对象(或数组)的核心功能,并在承诺解决时更新所述对象或数组。这里有一个GUI供你玩。
第二个服务将其集成到$http
中。基本上,您可以使用smartHttp.forArray(config)
和smartHttp.forObj(config)
来代替$http(config)
。如果您最终使用了这个方法,并且希望使用$http
快捷方法,那么实现起来应该很简单。这是未经测试的-所以把它看作是伪码。如果您正在立即返回缓存的值/dud值,那么使用smartHttp
服务返回值的承诺是没有意义的(除非您试图使该服务与$http
可互换)。如果你希望这是一个承诺,或者任何你可以改变的原因:
var general = function (obj, methodName) {
// ...
return obj;
};
以下各点:
var general = function (obj, methodName) {
// ...
return $q.when(obj);
};
然后请求$q
服务,当然。这里的真正问题是请求之间的平等--我认为$http
很好地做到了这一点;我做了一个简单的键--您可能想要更改它(只要您有简单的请求/对所有我认为不重要的事情都有相同的顺序)。
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;
});
https://stackoverflow.com/questions/17923815
复制相似问题