दिलचस्प पोस्ट
CSS3 के ग्रेडियंट बॉर्डर्स एंड्रॉइड स्टूडियो "आर" को प्रतीक आर के हल नहीं कर सकता है, लेकिन लाल रंग के साथ लाल रंग में आर मारता है, लेकिन सफल बनाते हैं एचटीएमएल पेज को लंगर के लिए कैसे स्क्रॉल करें? PHP में जावास्क्रिप्ट चर वैल्यू कैसे प्राप्त करें I मैं रेडियो बटन के रंग को कैसे बदलूं? ओरेकल एसक्यूएल डेवलपर में दी गई तालिका को किस तालिका में पता लगाया जा सकता है? मैं एक (यूनिक्स) शैल स्क्रिप्ट में JSON को बहुत प्रिंट कैसे कर सकता / सकती हूं? पाठ को आउटलाइन प्रभाव सी में, पॉइंटर्स घोषित करने के लिए सही सिंटैक्स क्या है? जावा में नंबर के लिए अग्रणी शून्य जोड़ें? बिटमैप की अस्पष्टता कैसे बदलनी है? कास्टिंग कच्चे तार अजगर स्थानीय अधिसूचना को दोबारा अंतराल कस्टम समय अंतराल कैसे सेट करें? एएसपी.एनटी वेब एपीआई में त्रुटियों की वापसी के लिए सर्वश्रेष्ठ अभ्यास पायथन Urllib2 SSL त्रुटि

वादा डिस्पोजर पैटर्न क्या है?

मैंने कई स्थानों पर वादा डिस्पैसर पैटर्न के बारे में पढ़ा है, लेकिन मुझे पता नहीं है कि यह क्या है। मुझे उस कोड का उपयोग करने के लिए सुझाव दिया गया था, जो ऐसा दिखता है:

function getDb(){ return myDbDriver.getConnection(); } var users = getDb().then(function(conn){ return conn.query("SELECT name FROM users").finally(function(users){ conn.release(); }); }); 

वादा डिस्पोजर पैटर्न क्या है और यह यहां कैसे लागू होता है?


नोट – देशी वादों में, मैं शिम। .finally में "दोनों अस्वीकृति और पूर्ति संचालकों को जोड़ते हैं जो मान वापस लौटते हैं लेकिन कोई कार्य करते हैं"। अगर मैं मामला उठाता हूँ तो मैं इस मामले में ब्लूबर्ड का उपयोग कर रहा हूं।

वेब के समाधान से एकत्रित समाधान "वादा डिस्पोजर पैटर्न क्या है?"

आपके कोड के साथ समस्या

उपरोक्त दृष्टिकोण के साथ समस्या यह है कि यदि आप हर बार जब आप getDb करते हैं तो कनेक्शन रिसाव को getDb हैं, तो आपके पास एक संसाधन रिसाव होता है, जो आपके ऐप को फ्रीज़ कर सकता है, जब वह संसाधन से बाहर निकलता है जो आप लीक कर रहे हैं।

आप एक ही स्थान पर ऐसा कर सकते हैं:

 var users = getDb().then(function(conn){ return conn.query("SELECT name FROM users"); }); 

कौन सा डाटाबेस कनेक्शन रिसाव करेगा जो कि कभी बंद नहीं हुआ था।


डिस्पोजर पैटर्न

डिस्पोजर पैटर्न संसाधन के स्वामी के साथ युगल को कोड का दायरा देता है। एक दायरे के लिए संसाधन बाध्य करके हम यह सुनिश्चित करते हैं कि यह हमेशा जारी रहता है जब हम इसे पूरा कर लेते हैं और हम इसे रिलीज करने के लिए आसानी से नहीं भूल सकते। यह सी # में, पायथन में और जावा के साथ-साथ-संसाधन के साथ-साथ सीए ++ में आरएआईआई के प्रयोग के समान है।

ऐसा लग रहा है:

  withResource(function(resource){ return fnThatDoesWorkWithResource(resource); // returns a promise }).then(function(result){ // resource disposed here }); 

इसे यहां लागू करना

यदि हमने अपना कोड लिखा है:

 function withDb(work){ var _db; return myDbDriver.getConnection().then(function(db){ _db = db; // keep reference return work(db); // perform work on db }).finally(function(){ if (_db) _db.release(); }); } 

हम अपना उपरोक्त कोड लिख सकते हैं:

  withDb(function(conn){ return conn.query("SELECT name FROM users"); }).then(function(users){ // connection released here }); 

डिस्प्लेर पैटर्न के उपयोगकर्ताओं के उदाहरणों का अनुक्रमण और knex (बुकशेल्फ की क्वेरी बिल्डर) हैं। उदाहरण के लिए सभी AJAX अनुरोधों को पूरा करने पर लोडर को छुपाने जैसी सरल चीज़ों के लिए इसका उपयोग करना भी संभव है।

Bluebird

चूंकि आप .disposer का उपयोग कर रहे हैं, इसलिए आपने Promise.using किया है कि आप एक ही समय में कई संसाधन लेना / जारी कर सकते हैं।