जावास्क्रिप्ट में प्रॉमिस हेल की समस्या
आप पहले से ही जानते हैं कि प्रॉमिस को कॉलबैक हेल की समस्या को हल करने के लिए बनाया गया था। हालाँकि, समय के साथ यह पता चला कि प्रॉमिस भी जटिल कोड पैदा कर सकते हैं। इस समस्या को सादृश्यता के आधार पर प्रॉमिस हेल नाम दिया गया।
आइए इस समस्या को कोड उदाहरणों के द्वारा देखें। मान लीजिए कि हमारे पास एक फंक्शन getSmth है,
जो एक पैरामीटर प्राप्त करता है और उस पैरामीटर के आधार पर परिणाम लौटाता है:
function getSmth(num) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num * num), 1000)
});
}
इस मामले में हम कुछ उपयोगी ऑपरेशन (उदाहरण के लिए, सर्वर से डेटा प्राप्त करना) का अनुकरण कर रहे हैं। अनुकरण के रूप में हम केवल एक संख्या पैरामीटर के रूप में पास करते हैं और एक सेकंड के बाद उस संख्या का वर्ग लौटाते हैं।
आइए अब हमारे फंक्शन getSmth का उपयोग दूसरे फंक्शन के अंदर करें:
function func() {
getSmth(2).then(res => {
console.log(res); // 4 प्रिंट करेगा
});
}
func();
पहली समस्या
एक के बाद एक आने वाले कई then कंस्ट्रक्शन कोड को समझना मुश्किल बना देते हैं:
function func(){
getSmth(2).then(res1 => {
// कुछ करते हैं
}).then(res2 => {
// कुछ करते हैं
}).then(res3 => {
// कुछ करते हैं
}).then(res4 => {
// कुछ करते हैं
}).then(res5 => {
// कुछ करते हैं
}).then(res6 => {
// कुछ करते हैं
});
}
func();
दूसरी समस्या
एक और प्रकार की समस्या भी है। मान लीजिए कि अब हम अपने फंक्शन का दो बार उपयोग करना चाहते हैं, फिर परिणामों को जोड़ना चाहते हैं। परिणामस्वरूप हमारा कोड इस प्रकार होगा:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
console.log(res1 + res2); // 13 प्रिंट करेगा
});
});
}
func();
क्या यह पहले से ही कॉलबैक हेल जैसा नहीं लग रहा? चलिए एक और फंक्शन कॉल जोड़ते हैं - कोड और भी बदतर हो जाएगा:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();
बेशक, Promise.all का उपयोग किया जा सकता है:
function func() {
Promise.all([getSmth(2), getSmth(3), getSmth(4)]).then(res => {
console.log(res[0] + res[1] + res[2]);
});
}
func();
हालाँकि, क्या हमें वही चीज़ मिली? नहीं! पहले मामले में प्रत्येक नया फंक्शन पिछले प्रॉमिस के पूरा होने की प्रतीक्षा करता है, जबकि दूसरे मामले में - सभी प्रॉमिस एक साथ निष्पादित होते हैं। यह अंतर तब महत्वपूर्ण होगा जब हम अगले फंक्शन में पिछले कॉल को पास करना चाहेंगे:
function func() {
getSmth(2).then(res1 => {
getSmth(res1).then(res2 => {
getSmth(res2).then(res3 => {
console.log(res3);
});
});
});
}
func();