[英]using memoize function with 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的結果是否正確。 一旦將其放入緩存中,如何基於密鑰進行檢索。 即'國家'。
讓我們理解_.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作為一個處理數組參數的函數時,這對我來說是一個真正的幫助。
希望這有助於許多人的工作。
_.memoize
需要一個函數:
var fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
您應該明白,這只是一個額外的包裝函數,它使您將其作為參數更智能地傳遞給它的函數(向其添加額外的映射對象)。
在上面的示例中,計算斐波納契數的函數用_.memoize
包裹。 所以在每個函數調用( fibonacci(5)
或fibonacci(55555)
)傳遞的參數匹配返回值,所以如果你需要再調用一次fibonacci(55555)
它不需要再次計算它。 它只是從內部提供的_.memoize
映射對象中獲取該值。
如果您使用的是Angular.js的$http
,您可能只想將{cache : true}
作為第二個參數傳遞給get
方法。
為了儲存使用鍵值對的值,你可能需要使用$ cacheFactory ,像在其他的答案中描述這里 。 基本上:
var cache = $cacheFactory('cacheId');
cache.put('states', 'value');
cache.get('states');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.