दिलचस्प पोस्ट
निर्दिष्ट टेम्पलेट पैरामीटर के साथ C ++ 11 make_pair संकलन नहीं करता है Android LocationManager.getLastKnownLocation () रिक्त देता है समूह युग्नेट परीक्षण String.valueOf (रिक्त) एक NullPointerException क्यों फेंकता है? पायथन में ग्रुपिंग / क्लस्टरिंग नंबर एचटीएमएल फॉर्म एक्शन और ऑनसबमिट इश्यू HTML5 वीडियो टैग के लिए समर्थित वीडियो प्रारूपों का पता कैसे लगाया जाता है? एंड्रॉइड एप्लिकेशन में वॉल्यूम कंट्रोल मुझे किसका उपयोग करना चाहिए: "लिखें-होस्ट", "लिखना-आउटपुट", या " :: लिस्टलाइन"? पिछला पृष्ठ वापस कैसे जाए StringBuilder के अंतिम वर्ण को निकालें? सी ++ 11 लैम्ब्डा में संदर्भ द्वारा एक संदर्भ कैप्चर करना मौजूदा asp.net एप्लिकेशन को asp.net MVC पैटर्न प्रारूप में कैसे माइग्रेट करें क्या सीएमडी.एक्सए के लिए उपयोगिता है? क्रोम डेवलपर टूल वर्कस्पेस मैपिंग्स

स्पष्ट वादा निर्माण 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 कन्स्ट्रक्टर एंटीपाटन " कहा जाता है, इस कोड के बारे में क्या बुरा है और इसे एक विरोधी क्यों कहा जाता है?

Solutions Collecting From Web of "स्पष्ट वादा निर्माण 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 बनाते हैं और पहले से ही मौजूदा वादों को शामिल करते हैं, तो लाइब्रेरी एपी को पहले देखें । डिफर्ड एंटीपाटन अक्सर उन लोगों द्वारा उपयोग किया जाता है, जो देखेंगे [केवल] एक पर्यवेक्षक पैटर्न के रूप में – लेकिन वाद-विवाद कॉलबैक से अधिक है : वे कम्पोज़ योग्य होना चाहिए। प्रत्येक सभ्य पुस्तकालय में हर कमजोर तरीके से वादों की रचना के लिए आसान-से-उपयोग की जाने वाली फ़ंक्शंस हैं, जो सभी निम्न-स्तर वाली चीजों का ध्यान रखते हैं जिन्हें आप से निपटना नहीं चाहते हैं।

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