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




promise q (2)

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

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

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

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

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

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

Promise कन्स्ट्रक्टर का उपयोग करना:

function getStuffDone(param) {
    return new Promise(function(resolve, reject) {
        myPromiseFn(param+1)
            .then(function(val) { resolve(val); }) // or .then(resolve)
            .catch(function(err) { reject(err); }); // or .catch(reject)
    });
} 

क्यू या स्थगित का उपयोग करना:

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

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


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

वादे के साथ श्रृंखला कर सकते हैं। .then और आप सीधे वादे वापस कर सकते हैं। getStuffDone में आपका कोड इस getStuffDone लिखा जा सकता है:

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

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

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

Esailija उद्धरण:

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





es6-promise