यहाँ समझने के लिए महत्वपूर्ण बातें
दोनों 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(…)
रिटर्न करता है ।