यहाँ समझने के लिए महत्वपूर्ण बातें
दोनों thenऔर catchकार्य नए वादे वस्तुओं को वापस करते हैं।
या तो फेंकना या स्पष्ट रूप से अस्वीकार करना, वर्तमान वादे को अस्वीकार किए गए राज्य में ले जाएगा।
चूंकि thenऔर catchनए वादे वस्तुओं को वापस करते हैं, उन्हें जंजीर बनाया जा सकता है।
यदि आप एक वादा हैंडलर ( thenया catch) के अंदर फेंकते हैं या अस्वीकार करते हैं , तो इसे अगले अस्वीकरण हैंडलर को चैनिंग मार्ग से संभाला जाएगा।
जैसा कि jfriend00 ने उल्लेख किया है, thenऔर catchहैंडलर को समान रूप से निष्पादित नहीं किया जाता है। जब एक हैंडलर फेंकता है, तो यह तुरंत समाप्त हो जाएगा। तो, स्टैक अनफॉलो हो जाएगा और अपवाद खो जाएगा। यही कारण है कि एक अपवाद को फेंकना वर्तमान वादे को अस्वीकार करता है।
आपके मामले में, आप do1किसी Errorवस्तु को फेंककर अंदर अस्वीकार कर रहे हैं । अब, वर्तमान वादा अस्वीकृत स्थिति में होगा और नियंत्रण अगले हैंडलर को स्थानांतरित कर दिया जाएगा, जो thenहमारे मामले में है।
चूंकि thenहैंडलर के पास अस्वीकृति हैंडलर नहीं है, इसलिए do2इसे बिल्कुल भी निष्पादित नहीं किया जाएगा। आप console.logइसके अंदर का उपयोग करके इसकी पुष्टि कर सकते हैं । चूंकि वर्तमान वादे में अस्वीकृति हैंडलर नहीं है, इसलिए इसे पिछले वादे से अस्वीकृति मूल्य के साथ भी खारिज कर दिया जाएगा और नियंत्रण अगले हैंडलर को स्थानांतरित कर दिया जाएगा catch।
जैसा catchकि एक अस्वीकृति हैंडलर है, जब आप इसके console.log(err.stack);अंदर करते हैं, तो आप त्रुटि स्टैक ट्रेस देखने में सक्षम होते हैं। अब, आप Errorइसमें से एक वस्तु फेंक रहे हैं, इसलिए द्वारा दिया गया वादा catchभी अस्वीकार की स्थिति में होगा।
चूंकि आपने किसी भी अस्वीकृति हैंडलर को संलग्न नहीं किया है catch, इसलिए आप अस्वीकृति का निरीक्षण नहीं कर सकते हैं।
आप श्रृंखला को विभाजित कर सकते हैं और इस तरह से बेहतर समझ सकते हैं
var promise = do1().then(do2);
var promise1 = promise.catch(function (err) {
console.log("Promise", promise);
throw err;
});
promise1.catch(function (err) {
console.log("Promise1", promise1);
});
आपको जो आउटपुट मिलेगा वह कुछ इस तरह होगा
Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }
catchहैंडलर 1 के अंदर , आपको promiseअस्वीकृत के रूप में ऑब्जेक्ट का मूल्य मिल रहा है ।
उसी तरह, catchहैंडलर 1 द्वारा लौटाए गए वादे को भी उसी त्रुटि के साथ promiseखारिज कर दिया जाता है जिसके साथ खारिज कर दिया गया था और हम इसे दूसरे catchहैंडलर में देख रहे हैं ।
.catch(…)रिटर्न करता है ।