我正在尝试使用memoize
中的Underscore.js
函数缓存来自ajax调用的结果。我不确定我的实施情况。还有如何使用密钥检索缓存的结果数据。以下是我的实施:
Javascript代码:
var cdata = $http
.get(HOST_URL + "/v1/report/states")
.success(function(data) {
//put the result in the angularJs scope object.
$scope.states = data;
});
//store the result in the cache.
var cachedResult = _.memoize(
function() {
return cdata;
}, "states");
我使用memoize来存储ajax的结果是否正确。一旦将其放入缓存中,如何基于密钥进行检索。即'州'。
答案 0 :(得分:34)
让我们理解_.memoize
是如何工作的,它需要一个需要被记忆为第一个参数的函数,并缓存给定参数的函数返回结果。下次如果使用相同的参数调用memoized函数,它将使用缓存的结果,并且可以避免函数的执行时间。因此减少计算时间非常重要。
如上所述,上面提到的斐波纳契函数完全没有问题,因为参数具有原始类型。
当您必须记住接受对象的函数时,会出现问题。为了解决这个问题,_.memoize
接受一个可选参数hashFunction
,它将用于散列输入。这样,您就可以使用自己的哈希函数唯一地标识对象。
_.memoize
的默认实现(使用默认哈希函数)返回第一个参数 - 如果是JavaScript,它将返回[Object object]
。
所以,例如。
var fn = function (obj){ some computation here..}
var memoizedFn = _.memoize(fn);
memoizedFn({"id":"1"}) // we will get result, and result is cahced now
memoizedFn({"id":"2"}) // we will get cached result which is wrong
为什么默认在_.memoize中有函数是函数(x){return x}
通过传递哈希函数
可以避免这个问题_.memoize(fn, function(input){return JSON.stringify(input)});
当我使用_.memoize来处理正在处理数组参数的函数时,这对我来说是一个真正的帮助。
希望这有助于许多人的工作。
答案 1 :(得分:5)
_.memoize
需要一个功能:
var fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
你应该明白,这只是一个额外的包装器函数,它使你将它作为一个更聪明的参数传递给它的函数(向它添加额外的映射对象)。
在上面的示例中,计算斐波纳契数的函数用_.memoize
包裹。因此,在每个函数调用(fibonacci(5)
或fibonacci(55555)
)上传递的参数与返回值匹配,因此如果您需要再调用一次fibonacci(55555)
,则不需要再次计算它。它只是从_.memoize
内部提供的映射对象中获取该值。
答案 2 :(得分:-1)
如果您使用的是Angular.js $http
,您可能只想将{cache : true}
作为第二个参数传递给get
方法。
要使用键值对存储值,您可能需要使用$cacheFactory,如here等其他答案中所述。基本上是:
var cache = $cacheFactory('cacheId');
cache.put('states', 'value');
cache.get('states');