Javascript 将memoize函数与下划线.js一起使用
我正在尝试使用Javascript 将memoize函数与下划线.js一起使用,javascript,angularjs,underscore.js,Javascript,Angularjs,Underscore.js,我正在尝试使用underline.js中的memoize函数缓存ajax调用的结果。我不确定我的执行情况。以及如何使用键检索回缓存的结果数据。以下是我的实施: Javascript代码: var cdata = $http .get(HOST_URL + "/v1/report/states") .success(function(data) { //put the result in the angularJs scope object. $scope.states = da
underline.js
中的memoize
函数缓存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的结果是正确的。同样,一旦它被放入缓存,如何基于密钥进行检索。i、 e“states.”具有以下功能:
var fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
var fibonacci=\uu0.memoize(函数(n){
返回n<2?n:fibonacci(n-1)+fibonacci(n-2);
});
您应该理解,这只是一个额外的包装函数,它使作为参数传递的函数更智能(向其添加额外的映射对象)
在上面的示例中,计算斐波那契数的函数用
\uuu0.memoize
环绕。因此,在每次函数调用(fibonacci(5)
或fibonacci(55555)
)时,都会传递与返回值匹配的参数,因此如果需要再次调用fibonacci(5555555)
,则无需再次计算。它只是从内部提供的映射对象中获取该值。如果使用Angular.js的$http
,您可能只想将{cache:true}
作为第二个参数传递给get
方法
要使用键值对存储值,您可能需要使用,如其他答案中所述。基本上:
var cache = $cacheFactory('cacheId');
cache.put('states', 'value');
cache.get('states');
让我们了解一下
\ memoize
是如何工作的,它将需要记忆的函数作为第一个参数,并缓存给定参数的函数返回结果。下次,如果使用相同的参数调用memorized函数,它将使用缓存的结果,并且可以避免函数的执行时间。因此,减少计算时间是非常重要的
如上所述,它记忆的上述fibonaci函数工作得非常好,因为参数具有基元类型
当您必须记忆接受对象的函数时,就会出现问题。为了解决这个问题,\uuuIZE
接受一个可选参数hashFunction
,该参数将用于对输入进行哈希运算。通过这种方式,您可以使用自己的哈希函数唯一地标识对象
\uuu0.memoize
(使用默认哈希函数)的默认实现将按原样返回第一个参数-对于JavaScript,它将返回[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
为什么默认值在uz中有函数。memoize是函数(x){return x}
通过传递哈希函数可以避免该问题
_.memoize(fn, function(input){return JSON.stringify(input)});
当我对一个处理数组参数的函数使用u.memoize时,这对我来说是一个真正的帮助
希望这对很多人的工作有所帮助。修复了一些语法错误并添加了一些附加信息。警告:该示例具有无限递归!调用
fibonacci(x)