मैं वादों से जूझ रहा हूं
निम्नलिखित स्निपेट होना:
Promise.resolve()
.then(a("OK1"))
.then(a("OK2"))
.then(a("OK3"))
.then(a("OK4"))
.then(a("OK5"))
.then(function() {
console.log("FINISH");
})
.catch(function(e) {
console.log("ERROR: " + e);
});
function a(i) {
return new Promise(function(resolve, reject) {
if(i == "OK4") {
console.log("THROW");
throw('Error'); //This does not happen
reject();
return;
}
if(i == "OK2") {
reject()
return;
}
console.log(i);
resolve();
});
}
मैं एक वादे को अस्वीकार करने में सक्षम होना चाहता हूं - फिर अगला .then
निष्पादित किया जाता है ("OK3") लेकिन मैं अपवादों को फेंकने में असमर्थ हूं - मैं "OK4" पर .catch को ट्रिगर करना चाहता हूं
OK4 - अस्वीकार कर दिया गया है और आउटपुट नहीं किया गया है, लेकिन OK5 अभी भी निष्पादित हो जाता है - क्या इसके आसपास कोई रास्ता है?
यह मेरा अपेक्षित आउटपुट होगा:
OK1
OK3
ERROR: ....
1 उत्तर
जैसा कि बर्गी ने उल्लेख किया है, आप जिस पैरामीटर को प्रत्येक .then
पर पास कर रहे हैं, वह तुरंत फ़ंक्शन चलाता है और एक वादा वापस करता है। वादा श्रृंखला को उस फ़ंक्शन के संदर्भ की आवश्यकता होती है जिसे वह बाद की तारीख में चला सकता है।
यदि आप अपने फ़ंक्शन को एक पैरामीटर के साथ चलाना चाहते हैं, तो आप इसे एक अनाम फ़ंक्शन में लपेट सकते हैं ताकि वादा श्रृंखला बाद में अनाम फ़ंक्शन को चला सके।
a("OK1")
.then((res)=>{
return a("OK2")
})
.then((res)=>{
return a("OK3")
})
.then((res)=>{
return a("OK4")
})
.then((res)=>{
return a("OK5")
})
.then(()=>{
console.log("FINISH");
})
.catch(function(e) {
console.log("ERROR: " + e);
});
function a (i) {
return new Promise(function(resolve, reject) {
if(i == "OK4") {
console.log("THROW");
throw new Error(i); //This does not happen
}
if(i == "OK2") {
return reject(new Error(i))
}
setTimeout(function () {
console.log(i);
resolve(i);
}, 100)
});
}
एक फ़ंक्शन पास करना ठीक है जो अंततः एक वादा वापस कर देगा। फ़ंक्शन को उस मान को पारित किया जाएगा जिसे पिछले वादे के साथ हल किया गया था।
b(1)
.then(b)
.then(b)
.then(b)
.then((res) => {
console.log("FINISH",res);
})
.catch(function (e) {
console.log("ERROR: " + e);
});
function b (i) {
return new Promise(function (resolve, reject) {
console.log(i)
resolve(i+1)
})
}
then
पास करना होगा, वादा नहीं। आप अपने सभी कार्यों को बिना किसी जंजीर के निष्पादित कर रहे हैं।Promise
कंस्ट्रक्टर कॉल में उसी तरह लपेटना होगा जैसे आपने अपने प्रश्न में किया था, ताकिresolve
क्लोजर के माध्यम से उपलब्ध हो। सुनिश्चित नहीं हैं कि मैं प्रश्न को समझता हूँ?then
(दोनों में से किसी एक में) फ़ंक्शन पास नहीं कर रहे हैं, इसलिए मुझे संदेह है कि कुछ भी काम करता है।