खारिज किए जाने के बाद वादे "संभाले" जा सकते हैं। यानी, एक कैच हैंडलर प्रदान करने से पहले एक वादे को अस्वीकार कर सकता है। यह व्यवहार मेरे लिए थोड़ा परेशान करने वाला है क्योंकि कोई भी लिख सकता है ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
... और इस मामले में, वादा चुपचाप खारिज कर दिया जाता है। यदि कोई कैच हैंडलर जोड़ना भूल जाता है, तो कोड चुपचाप त्रुटियों के बिना चलता रहेगा। इससे लिंग और सख्त कीड़े मिल सकते हैं।
Node.js के मामले में, इन अनहेल्ड प्रॉमिस रिजेक्ट को संभालने और समस्याओं की रिपोर्ट करने की बात है। यह मुझे ES7 async / प्रतीक्षा में लाता है। इस उदाहरण पर विचार करें:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
let temp = await tempPromise;
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
await changeClothes("warm");
} else {
await changeClothes("cold");
}
await teethPromise;
}
ऊपर दिए गए उदाहरण में, मान लीजिए कि दांत खारिज कर दिए गए थे (त्रुटि: टूथपेस्ट से बाहर!) पूरा होने से पहले। इस मामले में, दांतों की प्रतीक्षा तक एक अनहेल्ड प्रॉमिस रिजेक्शन होगा।
मेरा कहना यह है ... यदि हम अनहेल्ड प्रॉमिस रिजेक्शन को एक समस्या मानते हैं, तो प्रॉमिस जो बाद में एक वेट द्वारा नियंत्रित किया जाता है, अनजाने में बग के रूप में रिपोर्ट किया जा सकता है। फिर, यदि हम समस्याग्रस्त नहीं होने के लिए अनहेल्ड प्रॉमिस रिजेक्शन पर विचार करते हैं, तो वैध बग रिपोर्ट नहीं हो सकते हैं।
इस पर विचार?
यह यहां Node.js परियोजना में पाई गई चर्चा से संबंधित है:
डिफ़ॉल्ट अनहेल्ड रिजेक्शन डिटेक्शन बिहेवियर
यदि आप इस तरह से कोड लिखते हैं:
function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
return Promise.resolve(tempPromise)
.then(temp => {
// Assume `changeClothes` also returns a Promise
if (temp > 20) {
return Promise.resolve(changeClothes("warm"));
} else {
return Promise.resolve(changeClothes("cold"));
}
})
.then(teethPromise)
.then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}
जब getReadyForBed का आह्वान किया जाता है, तो यह अंतिम रूप से अंतिम (नहीं लौटाया गया) वादा करेगा - जिसमें किसी अन्य वादे के समान "अनहेल्ड रिजेक्शन" त्रुटि होगी (इंजन के आधार पर, कुछ भी नहीं हो सकता है)। (मुझे यह बहुत अजीब लगता है कि आपका फ़ंक्शन कुछ भी वापस नहीं करता है, जिसका अर्थ है कि आपका async फ़ंक्शन अपरिभाषित के लिए एक वादा करता है।
अगर मैं अभी एक पकड़ के बिना एक वादा करता हूं, और एक बाद में जोड़ देता हूं, तो सबसे "अनहेल्ड रिजेक्शन त्रुटि" कार्यान्वयन वास्तव में चेतावनी को वापस ले लेंगे जब मैं बाद में इसे संभालता हूं। दूसरे शब्दों में, async / इंतजार किसी भी तरह से "अनहेल्ड रिजेक्शन" चर्चा को बदल नहीं सकता है जो मैं देख सकता हूं।
इस नुकसान से बचने के लिए कृपया इस तरह से कोड लिखें:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
var clothesPromise = tempPromise.then(function(temp) {
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
return changeClothes("warm");
} else {
return changeClothes("cold");
}
});
/* Note that clothesPromise resolves to the result of `changeClothes`
due to Promise "chaining" magic. */
// Combine promises and await them both
await Promise.all(teethPromise, clothesPromise);
}
ध्यान दें कि यह किसी भी अनहेल्ड वादा अस्वीकृति को रोकना चाहिए।