दिलचस्प पोस्ट
CSS3 क्रॉस ब्राउज़र रैखिक ढाल क्या जेडीबीसी के साथ पोस्टग्रेड्स से कनेक्ट करते समय स्कीमा निर्दिष्ट करना संभव है? साझा संदर्भ में अर्रे सूची सहेजें आप एक आइफ्रेम के लिए कैसे पोस्ट करते हैं? डेटाबेस के बिना रेल मॉडल कस्टम स्थान के लिए स्थानीय पैकेज स्थापित करें संग्रह कैसे करता है। VB.NET बराबर विकल्प के साथ सी # 'गतिशील' सख्त पर संवेदनशील फ़ाइलों को निकालें और Git इतिहास से उनके कमान निकाल दें रिएक्टजेएस में बाल घटक से उसके माता-पिता के डेटा कैसे पास करें? हमें प्रतिलिपि कन्स्ट्रक्टर का उपयोग कब करना है? Java8 धाराओं में प्रसंस्करण के आदेश को सुनिश्चित करने के लिए कैसे? एंड्रॉइड – कस्टम फ़ॉन्ट का उपयोग करना सरल खोजकर्ता ऐडैप्टर और कंसल लोडर के लिए विस्तार योग्य LISTView स्थिर स्मृति आवंटन और गतिशील स्मृति आवंटन के बीच का अंतर

स्पष्ट वादा निर्माण antipattern क्या है और मैं इसे कैसे से बचने करूँ?

मैं कोड लिख रहा था जो ऐसा कुछ करता है जो दिखता है:

function getStuffDone(param) { | function getStuffDone(param) { var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) { // or = new $.Deferred() etc. | // using a promise constructor myPromiseFn(param+1) | myPromiseFn(param+1) .then(function(val) { /* or .done */ | .then(function(val) { d.resolve(val); | resolve(val); }).catch(function(err) { /* .fail */ | }).catch(function(err) { d.reject(err); | reject(err); }); | }); return d.promise; /* or promise() */ | }); } | } 

किसी ने मुझे बताया कि इसे " स्थगित प्रतिकृति " या " Promise कन्स्ट्रक्टर एंटीपाटन " कहा जाता है, इस कोड के बारे में क्या बुरा है और इसे एक विरोधी क्यों कहा जाता है?

वेब के समाधान से एकत्रित समाधान "स्पष्ट वादा निर्माण antipattern क्या है और मैं इसे कैसे से बचने करूँ?"

आस्थगित antipattern (अब स्पष्ट निर्माण विरोधी पैटर्न) Esailija द्वारा गढ़ा एक आम विरोधी पैटर्न लोग हैं जो वादे करने के लिए नए हैं, मैं खुद को जब मैं पहली बार वादा किया था उपरोक्त कोड के साथ समस्या यह है कि इस तथ्य का उपयोग करने में विफल रहता है कि वायदा श्रृंखला

वादा कर सकते हैं चेन के साथ। तब और आप सीधे वादे वापस कर सकते हैं getStuffDone में आपका कोड फिर से लिखा जा सकता है:

 function getStuffDone(param){ return myPromiseFn(param+1); // much nicer, right? } 

वादा करता है कि असिंक्रोनस कोड को अधिक पठनीय बनाने और उस तथ्य को छिपाए बिना तुल्यकालिक कोड की तरह व्यवहार करना होता है। वादा एक समय के ऑपरेशन के मूल्य पर एक अमूर्त का प्रतिनिधित्व करते हैं, वे किसी प्रोग्रामिंग भाषा में एक बयान या अभिव्यक्ति की धारणा को सार करते हैं।

आप केवल आस्थगित वस्तुओं का उपयोग करना चाहिए जब आप एक एपीआई को वादे करने के लिए परिवर्तित कर रहे हों और यह स्वचालित रूप से नहीं कर सकते हैं, या जब आप एकत्रीकरण कार्यों को लिख रहे हैं जो कि इस तरह से आसान व्यक्त किया गया है।

Esailija का हवाला देते हुए:

यह सबसे आम एंटी-पैटर्न है जब आप वास्तव में वादे नहीं समझते हैं और उन्हें महारत हासिल करने वाली घटनाओं या कॉलबैक उपयोगिता के रूप में सोचते हैं तो इसमें आसानी से आना पड़ता है चलो संक्षिप्त: वादों के बारे में अतुल्यकालिक कोड बना रहे हैं जैसे सममूल्य कोड के खोए गए गुणों जैसे फ्लैट इंडेंटेशन और एक अपवाद चैनल।

इसके साथ गलत क्या है?

लेकिन पैटर्न काम करता है!

तुम भाग्यशाली हो। दुर्भाग्य से, यह संभवत: ऐसा नहीं है, जैसा कि आप शायद कुछ किनारे के मामले को भूल गए थे। आधे से ज्यादा घटनाओं में मैंने देखा है, लेखक त्रुटि हैंडलर का ध्यान रखना भूल गए हैं:

 return new Promise(function(resolve) { getOtherPromise().then(function(result) { resolve(result.property.example); }); }) 

यदि दूसरे वादा को अस्वीकार कर दिया गया है, तो यह नए वादे (जहां इसे संभाला जाएगा) के प्रचार के बजाय अनदेखा नहीं किया जाएगा- और नया वादा हमेशा लंबित रहता है, जो लीक को प्रेरित कर सकता है।

इसी मामले में ऐसा ही होता है कि आपके कॉलबैक कोड में कोई त्रुटि होती है – उदाहरण के लिए जब result पास property नहीं होती है और अपवाद फेंक जाता है। वह अनियंत्रित हो जाएगा और नए वादा को अनसुलझे छोड़ देगा।

इसके विपरीत, .then() का उपयोग इन दोनों परिदृश्यों की स्वचालित रूप से ख्याल रखता है, और त्रुटि होने पर नए वादे को खारिज कर देता है:

  return getOtherPromise().then(function(result) { return result.property.example; }) 

स्थगित antipattern न केवल बोझिल है, बल्कि त्रुटि प्रवण भी है। चेनिंग के लिए .then() का उपयोग करना ज्यादा सुरक्षित है

लेकिन मैंने सब कुछ संभाला है!

वास्तव में? अच्छा। हालांकि, यह बहुत विस्तृत और प्रचुर होगा, खासकर यदि आप वायर्ड लाइब्रेरी का उपयोग करते हैं जो रद्दीकरण या संदेश पास करने जैसी अन्य सुविधाओं का समर्थन करता है। या हो सकता है कि यह भविष्य में हो, या आप अपनी लाइब्रेरी को बेहतर तरीके से बदलना चाहते हैं? आप इसके लिए अपना कोड फिर से लिखना नहीं चाहते हैं।

पुस्तकालयों के तरीकों ( then ) न केवल सभी सुविधाओं का समर्थन करते हैं, उनके पास जगह में कुछ अनुकूलन भी हो सकते हैं। उनका प्रयोग करने से आपका कोड अधिक तेज़ी से हो सकता है, या कम से कम पुस्तकालय के भविष्य के संशोधन से अनुकूलित किया जा सकता है।

मैं इसे कैसे से बचूं?

इसलिए जब भी आप अपने आप को मैन्युअल रूप से Promise या Deferred बनाते हैं और पहले से ही मौजूदा वादों को शामिल करते हैं, तो लाइब्रेरी एपी को पहले देखें । डिफर्ड एंटीपाटन अक्सर उन लोगों द्वारा उपयोग किया जाता है, जो देखेंगे [केवल] एक पर्यवेक्षक पैटर्न के रूप में – लेकिन वाद-विवाद कॉलबैक से अधिक है : वे कम्पोज़ योग्य होना चाहिए। प्रत्येक सभ्य पुस्तकालय में हर कमजोर तरीके से वादों की रचना के लिए आसान-से-उपयोग की जाने वाली फ़ंक्शंस हैं, जो सभी निम्न-स्तर वाली चीजों का ध्यान रखते हैं जिन्हें आप से निपटना नहीं चाहते हैं।

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