जावास्क्रिप्ट में प्रॉमिस चेन में एक्सेप्शन
मान लीजिए कि कुछ कारणों से हमारा प्रॉमिस त्रुटि के साथ समाप्त हो जाता है:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
इस स्थिति में, कोड का निष्पादन तुरंत उस
then पर चला जाएगा जिसमें त्रुटि हैंडलर
फ़ंक्शन है, या पहले catch पर, इसके आधार पर
कि कौन सा पहले मिलता है।
पहली स्थिति का उदाहरण यहाँ दिया गया है:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// निष्पादन तुरंत यहाँ कूद जाएगा
}
).then(
function(result) {
console.log(result);
}
);
दूसरी स्थिति का उदाहरण यहाँ दिया गया है:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// निष्पादन तुरंत यहाँ कूद जाएगा
}
).then(
function(result) {
console.log(result);
}
);
हैंडलर फ़ंक्शन के पास कार्रवाई के दो विकल्प हैं:
यदि उसने अपवादीय स्थिति को संभाल लिया है,
तो वह return के माध्यम से परिणाम वापस कर सकता है
और निष्पादन चेन के साथ आगे जारी रहेगा।
यदि उसने त्रुटि को संभाला नहीं है, तो वह
या तो कुछ भी वापस नहीं कर सकता है, या throw
के माध्यम से एक अपवाद (exception) फेंक सकता है।
इस स्थिति में, निष्पादन अगले त्रुटि हैंडलर
(then या catch - जो पहले मिले)
पर चला जाएगा।
आमतौर पर, चेन की सभी त्रुटियों को
एक ही स्थान पर पकड़ा जाता है: चेन के अंत में
एक catch लगाया जाता है:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// त्रुटि की स्थिति में यहाँ पहुंचेंगे
}
);
इस स्थिति में, अपवाद स्वयं प्रॉमिस में उत्पन्न
हो सकता है, या चेन के किसी भी लिंक में
throw के माध्यम से फेंका जा सकता है:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (सबकुछठीकहै) {
return result + '2';
} else {
throw new Error('त्रुटि'); // निकटतम हैंडलर पर जाएँ
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// निकटतम हैंडलर
}
);
ध्यान रखें कि catch विशेष रूप से
त्रुटि का निदान करने के लिए आवश्यक है:
क्या यह हल करने योग्य है या नहीं।
यदि त्रुटि हल करने योग्य है, तो catch को
उसका समाधान अपने बाद वाले then को
पास करना चाहिए।
और यदि हल करने योग्य नहीं है (या यह catch
बस नहीं जानता कि इसे कैसे हल किया जाए), तो हमें
या तो कुछ भी वापस नहीं करना चाहिए या एक अपवाद फेंकना चाहिए:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (त्रुटिहलकरनेयोग्यहै) {
return 'डेटा'; // अगले then को भेजें
} else {
// कुछ भी वापस न करें या अपवाद फेंकें
}
}
).then(
function(result) {
// यहाँ त्रुटि का समाधान करें
}
);