2014-10-21 3 views
7

में कैशिंग और प्री-फ़ेचिंग समाप्त होने वाले वादे जावास्क्रिप्ट में मेरे एसिंक्रोनस कोड को प्रबंधित करने का मेरा पसंदीदा तरीका है। ज्ञापन (एनपीएम पर memoizee) आसानी से कैशिंग & कार्यों के पूर्व-fetching परिणाम कैशिंग के लिए एक जावास्क्रिप्ट लाइब्रेरी है।जावास्क्रिप्ट

आदर्श रूप से मैं दोनों के सर्वश्रेष्ठ संयोजन को जोड़ना चाहता हूं, और एक वादा को "समाप्त" करने की क्षमता और एक नया वादा परिणाम पूर्व-प्राप्त करने की क्षमता है (जब कैश छुआ और समाप्त होने के करीब)। याद रखें यह कर सकता है, लेकिन यह वादे के साथ वादे के साथ बनाया गया था।

(मैं समझता हूँ कि वादे एक अंतर्निहित "हमेशा के लिए-कैश" है के रूप में उनके स्वभाव है, लेकिन हमेशा के लिए अपने आवेदन के लिए बहुत लंबा है)

मेरे सबसे अच्छा यह अब तक ऐसा करने के लिए प्रयास इस प्रकार है (bluebird, memoize और underscore का उपयोग कर उदाहरण Node.js):

var memoize = require('memoizee') 
    , Promise = require('bluebird') 
    , _ = require('underscore') 
    ; 

// returns a memoized Promise-generating function 
function memoizePromiser(funcReturningPromise, options) { 
    var opts = _.defaults(options || {}, {async: true}); 

    return Promise.promisify(memoize(function(){ 
     var args = _.initial(arguments); 
     var cb = _.last(arguments); 
     funcReturningPromise.apply(this, args).nodeify(cb); 
    }, opts)); 
}; 

इस समारोह मुझे एक async समारोह (नोड की तरह कॉलबैक के साथ) memoize करने की अनुमति देगा एक वादा लौटने, जबकि यह भी सभी कैश-समाप्ति प्रदान (+ अधिक) Memoize libra द्वारा प्रदान की गई कार्यक्षमता ry।

हालांकि, यह दृष्टिकोण मेरे लिए गन्दा और अधिक इंजीनियर लगता है। मैं खुद से सोचता हूं - निश्चित रूप से यह एक आम पर्याप्त समस्या है टोपी किसी और ने एक और अधिक सुरुचिपूर्ण समाधान किया है?

क्या मैं यह करने का प्रयास कर रहा हूं कि यह सबसे अच्छा तरीका है? क्या ऐसी कोई अन्य लाइब्रेरी है जो ज्ञापन के लिए विशेष रूप से डिज़ाइन की गई है? क्या कोई आसान समाधान है जिसे मैंने याद किया है?

किसी भी मार्गदर्शन की सराहना की जाएगी।

+1

उह, क्या आप कृपया बता सकते हैं कि 'memoize (funcReturningromrom, विकल्प)' के साथ वास्तव में क्या गलत है? हो सकता है कि मुझे समझ में नहीं आ रहा है कि एसिंक फ़ंक्शन के साथ आदि समाप्त होने के संबंध में विशेष व्यवहार है या नहीं, क्या वहां है? – Bergi

+0

यूरेका! इस बारे में बताने के लिए शुक्रिया। मुझे इस विचार में लपेटा गया था कि चूंकि मैं एसिंक कोड से निपट रहा था, इसलिए मुझे ज्ञापन की एसिंक कार्यक्षमता का उपयोग करना पड़ा (गन्दा नोड-जैसे कॉलबैक शामिल) - लेकिन मैं नहीं करता; वादा तुल्यकालिक रूप से वापस कर दिया जाता है। – Mikuso

+0

मैं इसे उत्तर दूंगा :-) – Bergi

उत्तर

1

यह फ़ंक्शन मुझे एक एसिंक फ़ंक्शन (नोड-जैसे कॉलबैक के साथ) को एक वादा वापस करने की अनुमति देगा। हालांकि, यह दृष्टिकोण मेरे लिए गन्दा और अधिक इंजीनियर लगता है।

हाँ - आपके पास पहले से ही एक वादा वापस करने वाला एक कार्य है, नोडबैक पर वापस जाने का कोई कारण नहीं है।

क्या कोई आसान समाधान है जिसे मैंने याद किया है?

एक समारोह है कि रिटर्न एक वादा सिर्फ एक समारोह है कि कुछ मान देता है - कि memoize समारोह द्वारा संचित किया जा सकता है एक मूल्य। बस

memoize(funcReturningPromise, options) 
+0

क्या होता है यदि funcReturningPromise विफल रहता है? क्या आप विफलता को पकड़ रहे हैं? –

+0

@ फिलिल: हाँ, उस मामले में अस्वीकार वादा कैश किया जाएगा। मुझे लगता है कि हालांकि यह उम्मीद की जाती है कि ज्ञापन का उद्देश्य एकाधिक अनुरोधों को रोकने के लिए है। यदि आप इसे नहीं चाहते हैं, तो भी आप रिजेक्शन पकड़ सकते हैं, या ज्ञापन कैश को शुद्ध कर सकते हैं। – Bergi

+0

समझ गया। मैं इसे केवल अच्छे मूल्यों को स्टोर करने के लिए देख रहा था, जैसा कि आप कहते हैं कि मुझे रिजेक्शन पकड़ने की ज़रूरत है और सुनिश्चित करें कि वे कैश में नहीं जाते- धन्यवाद –

0

आप वादे सही ढंग से समझ - एक वादा एक मूल्य के लिए एक प्रॉक्सी है - एक बार यह सेट है यह कभी नहीं बदल जाएगा।

केवल इस तरह से एक ही वादा वापस नहीं करना है - आपको हर बार एक अलग वादा वापस करना होगा (जैसे आपका उदाहरण करता है)। सरल समाधान वादा लौटने कार्यों के साथ memoize उपयोग करने के लिए किया जाएगा (और यह मूल्य के लिए वादा कैश चाहते हैं)।

यदि हमारे पास function foo(){ है जो एक वादा देता है। यह memoize के लिए बिल्कुल ठीक है जो स्वयं कार्य करता है और फिर लाइब्रेरी प्रदान करता है सभी उपकरणों का उपयोग करें।

नोट: promisify महंगा है और एक बहुत तेज समारोह का उत्पादन - क्या तुम सच में कार्यावधि में इसे कहते हैं नहीं करना चाहती। आप बस अपने कोड में new Promise लौट सकते हैं।

संबंधित मुद्दे