JavaScript में प्रॉमिसेस का परिचय

आप पहले से ही जानते हैं कि एसिंक्रोनस ऑपरेशन्स के लिए कॉलबैक मॉडल का उपयोग आसानी से callback hell की स्थिति पैदा कर देता है। इसलिए JavaScript में एक नया मॉडल पेश किया गया जिसे प्रॉमिसेस (promise) कहा जाता है। आइए इस मॉडल को सीखते हैं।

एक प्रॉमिस एक ऑब्जेक्ट होता है, जिसमें एक फ़ंक्शन पैरामीटर के रूप में पास किया जाता है, जिसके अंदर हमें अपना एसिंक्रोनस कोड लिखना होता है:

javascriptlet promise = new Promise(function() {
  // एसिंक्रोनस कोड
});

जैसा कि आप देख रहे हैं, मैंने प्रॉमिस वाले ऑब्जेक्ट को promise वेरिएबल में स्टोर कर लिया है। कोड के किसी अन्य भाग में मैं इस वेरिएबल पर then मेथड लगा सकता हूं, और इसमें एक फ़ंक्शन पास कर सकता हूं जिसमें वह कोड होता है जो इस प्रॉमिस के एसिंक्रोनस कोड के पूरा होने पर एक्ज़ीक्यूट होना चाहिए:

javascriptpromise.then(function() {
  // एसिंक्रोनस कोड के पूरा होने पर एक्ज़ीक्यूट होगा
});

यह थोड़ा कंफ्यूजिंग लग सकता है, इसलिए आइए एक उदाहरण देखते हैं। मान लीजिए मेरे पास निम्नलिखित एसिंक्रोनस कोड है:

javascriptsetTimeout(function() {
  let result = [1, 2, 3, 4, 5];
}, 3000);

मान लीजिए मैं इसके लिए एसिंक्रोनसिटी की हमारी मुख्य समस्या को सॉल्व करना चाहता हूं: टाइमर के खत्म होने के बाद कुछ कोड एक्ज़ीक्यूट करना। साथ ही, मैं यह कोड टाइमर के अंदर नहीं लिखना चाहता और चाहता हूं कि result वेरिएबल का रिजल्ट किसी तरह इस कोड में पहुंचे। असल में, हमने यह समस्या पिछले पाठों में कॉलबैक्स और सब्सक्रिप्शन्स के जरिए सॉल्व की थी। आइए अब देखते हैं कि इसे प्रॉमिसेस के जरिए कैसे करें।

सबसे पहले हमें अपने एसिंक्रोनस कोड को एक प्रॉमिस में रैप करना होगा:

javascriptlet promise = new Promise(function() {
  setTimeout(function() {
    let result = [1, 2, 3, 4, 5];
  }, 3000);
});

हालांकि, केवल इतना करना पर्याप्त नहीं है। हमें स्पष्ट रूप से यह इंगित करना होगा कि हमारा एसिंक्रोनस कोड पूरा हो गया है। इसमें हमारी मदद एक स्पेशल कम्प्लीशन फ़ंक्शन करेगा, जो ऑटोमैटिकली फ़ंक्शन के पहले पैरामीटर के रूप में उपलब्ध होता है, अगर इसे स्पेसिफाइड किया गया हो:

javascriptlet promise = new Promise(function(resolve) { // पैरामीटर स्पेसिफाइड करें
  setTimeout(function() {
    let result = [1, 2, 3, 4, 5];
  }, 3000);
});

कम्प्लीशन फ़ंक्शन की मदद से हम प्रॉमिस को स्पष्ट रूप से बता सकते हैं कि एसिंक्रोनस कोड पूरा हो गया है। इसके लिए हमें इस फ़ंक्शन को अपनी आवश्यकता के अनुसार सही जगह कॉल करना होगा:

javascriptlet promise = new Promise(function(resolve) {
  setTimeout(function() {
    let result = [1, 2, 3, 4, 5];
    resolve(); // प्रॉमिस को कम्प्लीट करें
  }, 3000);
});

साथ ही, अगर हम एसिंक्रोनस कोड का कोई रिजल्ट बाहर पास करना चाहते हैं, तो हम उसे अपने कम्प्लीशन फ़ंक्शन के पैरामीटर के रूप में पास कर सकते हैं:

javascriptlet promise = new Promise(function(resolve) {
  setTimeout(function() {
    let result = [1, 2, 3, 4, 5];
    resolve(result); // रिजल्ट पास करें
  }, 3000);
});

बेशक, इंटरमीडिएट वेरिएबल को हटाया जा सकता है:

javascriptlet promise = new Promise(function(resolve) {
  setTimeout(function() {
    resolve([1, 2, 3, 4, 5]);
  }, 3000);
});

अब कोड में किसी भी अन्य जगह पर हम अपने प्रॉमिस का then मेथड कॉल कर सकते हैं:

javascriptpromise.then(function() {
  // प्रॉमिस के कम्प्लीट होने पर एक्ज़ीक्यूट होगा
});

प्रॉमिस का रिजल्ट फ़ंक्शन के पहले पैरामीटर में पहुंच जाएगा, अगर हम इसे स्पेसिफाइड करना चाहें:

javascriptpromise.then(function(result) {
  console.log(result); // रिजल्ट वाली ऐरे को प्रिंट करेगा
});
Задание 1

एक प्रॉमिस बनाएं, जिसके अंदर 5 सेकंड की डिले हो, उसके बाद प्रॉमिस कम्प्लीट होना चाहिए, और अपने रिजल्ट के रूप में कोई टेक्स्ट रिटर्न करना चाहिए। इस टेक्स्ट को स्क्रीन पर प्रिंट करें।