簡體   English   中英

使用帶有underscore.js的memoize函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM