2014-07-23 37 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');