में कैशिंग और प्री-फ़ेचिंग समाप्त होने वाले वादे जावास्क्रिप्ट में मेरे एसिंक्रोनस कोड को प्रबंधित करने का मेरा पसंदीदा तरीका है। ज्ञापन (एनपीएम पर 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।
हालांकि, यह दृष्टिकोण मेरे लिए गन्दा और अधिक इंजीनियर लगता है। मैं खुद से सोचता हूं - निश्चित रूप से यह एक आम पर्याप्त समस्या है टोपी किसी और ने एक और अधिक सुरुचिपूर्ण समाधान किया है?
क्या मैं यह करने का प्रयास कर रहा हूं कि यह सबसे अच्छा तरीका है? क्या ऐसी कोई अन्य लाइब्रेरी है जो ज्ञापन के लिए विशेष रूप से डिज़ाइन की गई है? क्या कोई आसान समाधान है जिसे मैंने याद किया है?
किसी भी मार्गदर्शन की सराहना की जाएगी।
उह, क्या आप कृपया बता सकते हैं कि 'memoize (funcReturningromrom, विकल्प)' के साथ वास्तव में क्या गलत है? हो सकता है कि मुझे समझ में नहीं आ रहा है कि एसिंक फ़ंक्शन के साथ आदि समाप्त होने के संबंध में विशेष व्यवहार है या नहीं, क्या वहां है? – Bergi
यूरेका! इस बारे में बताने के लिए शुक्रिया। मुझे इस विचार में लपेटा गया था कि चूंकि मैं एसिंक कोड से निपट रहा था, इसलिए मुझे ज्ञापन की एसिंक कार्यक्षमता का उपयोग करना पड़ा (गन्दा नोड-जैसे कॉलबैक शामिल) - लेकिन मैं नहीं करता; वादा तुल्यकालिक रूप से वापस कर दिया जाता है। – Mikuso
मैं इसे उत्तर दूंगा :-) – Bergi