2014-07-23 38 views
12

我试图使用memoize功能从Underscore.js Ajax调用缓存结果memoize的功能。我不确定我的执行情况。还有如何使用密钥取回缓存的结果数据。下面是我的实现:使用带有underscore.js

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的结果是正确的。一旦它被放入缓存中,如何根据密钥进行检索。即'国家'。

回答

30

让我们了解_.memoize是如何工作的,它需要一个需要被memoized作为第一个参数和缓存功能,回报给定参数的结果的功能。下一次,如果使用相同的参数调用memoized函数,它将使用缓存的结果,并且可以避免函数的执行时间。所以减少计算时间非常重要。

如所提到的,以上的Fibonaci起作用它memoized工作完全正常作为参数具有一个基本类型。

问题时,你必须memoize的其接受一个对象的函数发生。为了解决这个问题,_.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 

为什么default在_中有函数。memoize的是函数(X){返回X}

可以通过传递一个哈希函数

_.memoize(fn, function(input){return JSON.stringify(input)}); 

这对我是一个真正的帮助,当我使用_.memoize因为这是一个功能来避免这个问题在数组参数上工作。

希望这有助于许多人的工作。

+0

修复了一些语法错误并增加了一些附加信息。 –

5

_.memoize需要一个功能:

var fibonacci = _.memoize(function(n) { 
    return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2); 
}); 

你应该明白,这只是一个额外的包装功能,让你把它当作智慧的参数功能(增加额外的映射对象的话)。

在以上示例中,计算Fibonacci数函数与_.memoize缠。因此,对每一个函数调用(fibonacci(5)fibonacci(55555))通过匹配的返回值,所以如果你需要调用一次fibonacci(55555)它并不需要重新计算它的说法。它只是从_.memoize内部提供的映射对象中提取该值。

-1

如果您使用的是Angular.js的$http,那么您可能只想将{cache : true}作为第二个参数传递给get方法。

要使用键值对存储值,您可能需要使用$cacheFactory,如here等其他答案中所述。基本上是:

var cache = $cacheFactory('cacheId'); 
cache.put('states', 'value'); 
cache.get('states');