javascript - किसी को आस्थगित बनाने की आवश्यकता कब होगी?




promise ecmascript-6 (2)

आमतौर पर ऐसा लगता है कि आस्थगित वस्तुओं का निर्माण अब ES6- शैली के वादे निर्माता के उपयोग के पक्ष में हतोत्साहित किया जाता है। क्या एक ऐसी स्थिति मौजूद है जहां एक आस्थगित का उपयोग करना आवश्यक होगा (या बस किसी तरह बेहतर)?

उदाहरण के लिए, इस पृष्ठ पर , निम्न उदाहरण को आस्थगित करने के औचित्य के रूप में दिया गया है:

function delay(ms) {
    var deferred = Promise.pending();
    setTimeout(function(){
        deferred.resolve();
    }, ms);
    return deferred.promise;
}

हालाँकि, यह वादा निर्माता के साथ ही किया जा सकता है:

function delay(ms) {
    return new Promise(function(resolve, reject){
        setTimeout(function(){
            resolve();
        }, ms);
    });
}

क्या एक ऐसी स्थिति मौजूद है जहां एक आस्थगित का उपयोग करना आवश्यक होगा (या बस किसी तरह बेहतर)?

ऐसी कोई स्थिति नहीं है जहां एक आस्थगित आवश्यक हो। "बेहतर" एक राय का विषय है इसलिए मैं यहां संबोधित नहीं करूंगा।

वहाँ एक कारण है कि ES6 वादा विनिर्देश एक आस्थगित वस्तु नहीं है। आप बस एक की जरूरत नहीं है कुछ भी है कि लोगों के लिए एक आस्थगित वस्तु का उपयोग करने के लिए हमेशा एक और तरीका है कि एक आस्थगित वस्तु का उपयोग नहीं करता है किया जा सकता है।

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

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

और, जैसा कि टोरबाज़ो बताता है, कुछ बाहरी कोड को हल करने या अपने वादे को अस्वीकार करने का एक अपने आप में एक विरोधी पैटर्न है। आपने वादा किया था - आप इसे हल / अस्वीकार करते हैं। यदि आप इसे हल / अस्वीकार करने के लिए निर्णय लेने के लिए बाहरी घटनाओं का उपयोग करना चाहते हैं, तो उन्हें आपको सूचित करें (अपने स्वयं के वादे या कॉलबैक के माध्यम से) और आप अपने स्वयं के वादे को हल / अस्वीकार कर सकते हैं। या, उन्हें अपने स्वयं के वादे का निर्माण करें जो आप उपयोग कर सकते हैं। यह वास्तव में वांछित मॉडल है। या, उन्हें अपने वादे पर जंजीर दें ताकि जब उनका ऑपरेशन हो जाए तो अंतिम परिणाम मिल जाए।

यदि किसी को आस्थगित ऑब्जेक्ट के साथ कोडिंग करने के लिए उपयोग किया गया था (एक jQuery के आस्थगित के साथ कहो), तो इसके बिना कोडिंग के लिए उपयोग होने में थोड़ा सा समय लग सकता है, लेकिन थोड़ी देर के बाद आप बस अलग तरह से सोचना शुरू कर देते हैं और इसका उपयोग करने के लिए स्वाभाविक रूप से आना शुरू हो जाता है वादा निर्माता।

एक बार जब आप किसी भी दिए गए एप्लिकेशन में आपके द्वारा उपयोग किए जाने वाले Async ऑपरेशंस के क्षेत्र का वादा करते हैं, तो यह बहुत दुर्लभ है कि आपको कभी भी अपने स्वयं के वादे बनाने की आवश्यकता नहीं है क्योंकि आप ज्यादातर केवल उन वादों का निर्माण कर रहे हैं जिन्हें आप कॉल करते हैं या उपयोग कर रहे हैं। प्रवाह नियंत्रण संचालन जैसे Promise.all() जो आपके लिए uber वादे बनाते हैं।

यह विरोधी पैटर्न का मुख्य बिंदु है। उन वादों का उपयोग करें जो आपके लिए पहले से निर्मित हैं बजाय मैन्युअल रूप से बनाए। उन्हें जंजीर। तर्क नियंत्रण के तहत async संचालन लिंक करने के लिए .then() हैंडलर से वादे वापस करें।

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


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

आज आस्थगित उपयोग करने का मुख्य कारण कोड के साथ पीछे की संगतता होगी जो उन अतिरिक्त तरीकों पर निर्भर करता है। राय क्षेत्र पर कदम रखे बिना अपने प्रश्न का एक निश्चित उत्तर देना कठिन है।





es6-promise