zil*_*anu 12 javascript underscore.js angularjs
我试图使用memoize函数来缓存来自ajax调用的结果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");
Run Code Online (Sandbox Code Playgroud)
我使用memoize来存储ajax的结果是否正确.一旦将其放入缓存中,如何基于密钥进行检索.即'国家'.
San*_*ani 35
让我们理解_.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
Run Code Online (Sandbox Code Playgroud)
为什么默认在_.memoize中有函数是函数(x){return x}
传递哈希函数可以避免这个问题
_.memoize(fn, function(input){return JSON.stringify(input)});
Run Code Online (Sandbox Code Playgroud)
当我使用_.memoize作为一个处理数组参数的函数时,这对我来说是一个真正的帮助.
希望这有助于许多人的工作.
_.memoize 采取功能:
var fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
Run Code Online (Sandbox Code Playgroud)
您应该明白,这只是一个额外的包装函数,它使您将其作为参数更智能地传递给它的函数(向其添加额外的映射对象).
在上面的例子中,计算斐波纳契数的函数被包裹着_.memoize.所以在每个函数调用(fibonacci(5)或fibonacci(55555))传递的参数匹配返回值,所以如果你需要再调用一次,fibonacci(55555)它不需要再次计算它.它只是从_.memoize内部提供的映射对象中获取该值.
| 归档时间: |
|
| 查看次数: |
10179 次 |
| 最近记录: |