2014-07-23 8 views
12

मैं एक ajax कॉल Underscore.js से memoize समारोह का उपयोग करने से परिणाम कैश करने के लिए कोशिश कर रहा हूँ के साथ 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 का परिणाम स्टोर करने के लिए सही है नीचे मेरी कार्यान्वयन है। एक बार इसे कैश में डाल दिया जाता है, तो कुंजी के आधार पर कैसे पुनर्प्राप्त किया जाए। i.e 'राज्य'।

var fibonacci = _.memoize(function(n) { 
    return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2); 
}); 

आप को समझना चाहिए कि यह सिर्फ एक अतिरिक्त आवरण समारोह समारोह है कि आप एक तर्क होशियार के रूप में इसे पारित बनाता है (यह करने के लिए अतिरिक्त मानचित्रण वस्तु जोड़ता है):

उत्तर

30

के तरीके को समझने _.memoize काम करता है, यह एक समारोह है जो पहले तर्क के रूप में memoized होने की जरूरत है और दिए गए पैरामीटर के लिए समारोह वापसी का परिणाम कैश लगते हैं। अगली बार यदि ज्ञापन फ़ंक्शन को उसी तर्क के साथ बुलाया जाता है तो यह कैश्ड परिणाम का उपयोग करेगा और फ़ंक्शन के निष्पादन समय से बचा जा सकता है। इसलिए गणना समय को कम करना बहुत महत्वपूर्ण है।

जैसा कि बताया गया है, उपरोक्त फिबोनासी फ़ंक्शन यह पूरी तरह से ठीक काम करता है क्योंकि तर्क का एक आदिम प्रकार है।

समस्या तब होती है जब आपको किसी ऑब्जेक्ट को स्वीकार करने वाले फ़ंक्शन को याद रखना होता है। इसे हल करने के लिए, _.memoize एक वैकल्पिक तर्क hashFunction स्वीकार करता है जिसका उपयोग इनपुट हैश करने के लिए किया जाएगा। इस तरह आप अपने ऑब्जेक्ट कार्यों के साथ अपनी वस्तुओं को विशिष्ट रूप से पहचान सकते हैं।

_.memoize (डिफ़ॉल्ट हैश फ़ंक्शन का उपयोग करके) का डिफ़ॉल्ट कार्यान्वयन पहला तर्क देता है - जावास्क्रिप्ट के मामले में यह [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} है

समस्या एक हैश समारोह

_.memoize(fn, function(input){return JSON.stringify(input)}); 

गुजर जब मैं एक समारोह है कि था के लिए _.memoize का उपयोग कर रहा था यह मेरे लिए एक असली मदद था से बचा जा सकता सरणी तर्क पर काम करना।

आशा है कि इससे उनके काम में कई लोगों की सहायता मिलती है।

+0

कुछ व्याकरण गलतियों को ठीक किया और कुछ अतिरिक्त जानकारी जोड़ा। –

5

_.memoize एक समारोह लेता है।

उदाहरण के लिए उपरोक्त फ़ंक्शन जो फिबोनाची संख्या की गणना करता है _.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'); 
संबंधित मुद्दे