使用带有underscore.js的memoize函数

时间:2014-07-23 04:44:10

标签: javascript angularjs underscore.js

我正在尝试使用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的结果是否正确。一旦将其放入缓存中,如何基于密钥进行检索。即'州'。

3 个答案:

答案 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');