दिलचस्प पोस्ट
स्वचालित रूप से वेबवॉल में फ़ील्ड भरें ओकेएचटीटीपी से बाइनरी फाइल डाउनलोड करें बाइनरी डेटा से ASP.NET में छवि नियंत्रण में कनवर्ट करें दो अनुप्रयोगों के बीच डेटा साझा करना विभिन्न डिवाइसों के लिए मेरे ओपन के उत्पादन अलग-अलग क्यों हैं? सिमेंटिक डिफ उपयोगिताओं फ्लास्क-एसक्यूएललेमी आयात / संदर्भ समस्या कैसे प्राप्त करने के लिए कि "ui-sref" सशर्त निष्पादित हो? पीआईपी स्थापित mysql- अजगर पर्यावरण के साथ विफल रहता है त्रुटि: mysql_config नहीं मिला पॉवरहेल बहुआयामी arrays डीबी स्तंभ में एक सूची को कैसे स्टोर करना है MySQL में ROW_NUMBER () डेटाफ़्रेम से कई तत्व निकालने का मानक तरीका JQuery के साथ "ऑनक्लिक" को कैसे निकालना है? एंड्रॉइड स्टूडियो – बाह्य पुस्तकालय / जार आयात करना

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

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

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 किया है कि आप एक ही समय में कई संसाधन लेना / जारी कर सकते हैं।