इसके साथ गलत क्या है?
लेकिन पैटर्न काम करता है!
तुम भाग्यशाली हो। दुर्भाग्य से, यह संभवतः नहीं है, जैसा कि आप की संभावना है कि कुछ किनारे के मामले को भूल गए। मैंने देखी गई घटनाओं में से आधे से अधिक में, लेखक त्रुटि हैंडलर की देखभाल करना भूल गया है:
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;
})
आस्थगित एंटीपैटर्न न केवल बोझिल है, बल्कि त्रुटि-प्रवण भी है । .then()
चेनिंग के लिए उपयोग करना अधिक सुरक्षित है।
लेकिन मैंने सब कुछ संभाला है!
वास्तव में? अच्छा। हालांकि, यह बहुत विस्तृत और प्रचुर होगा, खासकर यदि आप एक वादा पुस्तकालय का उपयोग करते हैं जो रद्द करने या संदेश पास करने जैसी अन्य सुविधाओं का समर्थन करता है। या शायद यह भविष्य में होगा, या आप अपने पुस्तकालय को एक बेहतर के खिलाफ स्वैप करना चाहते हैं? आप उसके लिए अपने कोड को फिर से लिखना नहीं चाहेंगे।
पुस्तकालयों के तरीके ( then
) केवल सभी सुविधाओं का मूल रूप से समर्थन नहीं करते हैं, उनके स्थान पर कुछ अनुकूलन भी हो सकते हैं। उनका उपयोग करने से संभवतः आपके कोड में तेज़ी आएगी, या कम से कम लाइब्रेरी के भविष्य के संशोधनों द्वारा अनुकूलित होने की अनुमति होगी।
मैं इससे कैसे बचूं?
इसलिए जब भी आप खुद को मैन्युअल रूप से एक Promise
या Deferred
पहले से मौजूद वादों को शामिल करते हुए पाते हैं, तो पहले पुस्तकालय एपीआई की जांच करें । डिफर्ड एंटीपैटर्न अक्सर उन लोगों द्वारा लागू किया जाता है जो वादे करते हैं [केवल] एक पर्यवेक्षक पैटर्न के रूप में देखते हैं - लेकिन वादे कॉलबैक से अधिक हैं : उन्हें रचना योग्य माना जाता है। प्रत्येक सभ्य पुस्तकालय में हर विचारशील तरीके से वादों की रचना के लिए बहुत आसान उपयोग कार्य हैं, उन सभी निम्न-स्तरीय सामानों की देखभाल करना, जिनसे आप निपटना नहीं चाहते हैं।
यदि आपको एक नए तरीके से कुछ वादों की रचना करने की आवश्यकता है जो एक मौजूदा सहायक फ़ंक्शन द्वारा समर्थित नहीं है, तो अपरिहार्य डिफ्रेड्स के साथ अपना फ़ंक्शन लिखना आपका अंतिम विकल्प होना चाहिए। एक और अधिक उपयोगी पुस्तकालय में जाने पर विचार करें, और / या अपने वर्तमान पुस्तकालय के खिलाफ बग दर्ज करें। इसके अनुरक्षक को मौजूदा कार्यों से रचना प्राप्त करने में सक्षम होना चाहिए, आपके लिए एक नया सहायक फ़ंक्शन लागू करना चाहिए और / या उन किनारे मामलों की पहचान करने में मदद करना चाहिए जिन्हें संभालने की आवश्यकता है।
getStuffDone
फ़ंक्शन रैपर को हटा दें और बस प्रोमिस शाब्दिक का उपयोग करें?