जावास्क्रिप्ट वादों के साथ शुरुआत करना
अतुल्यकालिक कोड उन कार्यों को करने के लिए उपयोगी है जो हैं बहुत समय लगेगा लेकिन, ज़ाहिर है, यह है विपक्ष से रहित नहीं. Async कोड का उपयोग करता है कॉलबैक फ़ंक्शन अपने परिणामों को संसाधित करने के लिए, हालांकि कॉलबैक फ़ंक्शन मान नहीं लौटा सकते विशिष्ट जावास्क्रिप्ट फ़ंक्शंस कर सकते हैं.
इस प्रकार, वे न केवल नियंत्रित करने की हमारी क्षमता को दूर ले जाते हैं समारोह का निष्पादन लेकिन यह भी बनाओ गलती संभालना थोड़ी परेशानी। यह वह जगह है जहाँ पक्का वादा
वस्तु में आता है, क्योंकि यह कुछ में भरने का लक्ष्य है अतुल्यकालिक कोडिंग में गड्ढे.
पक्का वादा
तकनीकी रूप से ए है मानक आंतरिक वस्तु जावास्क्रिप्ट में, जिसका अर्थ है आता है जावास्क्रिप्ट में बनाया गया. इसका प्रतिनिधित्व करने के लिए किया जाता है एक अतुल्यकालिक कोड ब्लॉक का अंतिम परिणाम (या कारण क्यों कोड विफल) और नियंत्रण करने के लिए तरीके हैं अतुल्यकालिक कोड का निष्पादन.
वाक्य - विन्यास
हम बना सकते हैं की एक मिसाल पक्का वादा
वस्तु का उपयोग करते हुए नया
कीवर्ड:
नया वादा (फ़ंक्शन (समाधान, अस्वीकार) );
कार्यक्रम एक पैरामीटर के रूप में पारित किया को पक्का वादा()
निर्माणकर्ता के रूप में जाना जाता है निष्पादक. यह एसिंक्रोनस कोड रखता है और के दो पैरामीटर हैं समारोह
प्रकार, के रूप में भेजा संकल्प
तथा अस्वीकार
कार्य (इन पर शीघ्र ही).
की अवस्थाएँ पक्का वादा
वस्तु
प्रारम्भिक अवस्था के पक्का वादा
वस्तु कहलाती है अपूर्ण. इस स्थिति में, अतुल्यकालिक गणना का परिणाम है अस्तित्व में नहीं है.
प्रारंभिक लंबित स्थिति में परिवर्तन होता है पूरा राज्य जब गणना है सफल. गणना का परिणाम इस अवस्था में उपलब्ध है.
मामले में अतुल्यकालिक गणना विफल रहता है, पक्का वादा
ऑब्जेक्ट को ले जाता है अस्वीकृत अपनी प्रारंभिक अवस्था से अपूर्ण राज्य। इस अवस्था में, गणना की विफलता का कारण (यानी त्रुटि संदेश) उपलब्ध कराया गया है.
से जाना है अपूर्ण सेवा मेरे पूरा राज्य, हल ()
कहा जाता है. से जाना है अपूर्ण सेवा मेरे अस्वीकृत राज्य, अस्वीकार()
कहा जाता है.
फिर
तथा पकड़
तरीकों
जब राज्य से बदलता है अपूर्ण सेवा मेरे पूरा, के ईवेंट हैंडलर पक्का वादा
वस्तु की फिर
तरीका निष्पादित किया जाता है। और, जब राज्य से बदलता है अपूर्ण सेवा मेरे अस्वीकृत, के ईवेंट हैंडलर पक्का वादा
वस्तु की पकड़
तरीका निष्पादित किया जाता है.
उदाहरण 1
“गैर Promisified” कोड
मान लें कि वहाँ एक है hello.txt
फ़ाइल जिसमें है “नमस्ते” शब्द। यहां बताया गया है कि हम AJAX अनुरोध कैसे लिख सकते हैं उस फ़ाइल को प्राप्त करें तथा इसकी सामग्री दिखाएं, बिना उपयोग के पक्का वादा
वस्तु:
फ़ंक्शन getTxt () Let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ( 'पाठ / सादे'); xhr.send (); xhr.onload = function () try स्विच (this.status) केस 200: document.write (this.response); टूटना; केस 404: थ्रो 'फाइल नॉट फाउंड'; डिफ़ॉल्ट: 'फ़ाइल लाने में विफल'; पकड़ (गलत) कंसोल.लॉग (गलत); getTxt ();
यदि फ़ाइल की सामग्री रही है सफलतापूर्वक लाया गया, अर्थात. प्रतिक्रिया स्थिति कोड 200 है, प्रतिक्रिया पाठ है दस्तावेज़ में लिखा है. अगर फाइल है नहीं मिला (स्थिति 404), ए “फाइल नहीं मिली” त्रुटि संदेश फेंका गया है। नहीं तो ए सामान्य त्रुटि संदेश फ़ाइल लाने में विफलता का संकेत देते हुए फेंक दिया जाता है.
“Promisified” कोड
चलिए अब उपर्युक्त कोड का प्रचार करें:
फ़ंक्शन getTxt () नया वादा (फ़ंक्शन (रिज़ॉल्यूशन, रिजेक्ट)) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt')); xhr .overrideMimeType ('टेक्स्ट / प्लेन'); xhr.send (); xhr.onload = function () स्विच (this.status) केस 200: हल (this.response); केस 404: अस्वीकार ('फाइल नहीं मिली'); डिफ़ॉल्ट: अस्वीकार ('विफल) फ़ाइल प्राप्त करें ');;); getTxt ()। तब (फ़ंक्शन (txt) document.write (txt);) पकड़ें (फ़ंक्शन (इरेट) कंसोल.लॉग (गलत););
getTxt ()
फ़ंक्शन को अब कोडित किया गया है का एक नया उदाहरण लौटाएँ पक्का वादा
वस्तु, और इसका निष्पादक कार्य पहले से अतुल्यकालिक कोड रखता है.
जब प्रतिक्रिया स्थिति कोड 200 है, पक्का वादा
है पूरा द्वारा बुला हल ()
(प्रतिक्रिया को पैरामीटर के रूप में पारित किया जाता है हल ()
)। जब स्टेटस कोड 404 या कुछ अन्य होता है, पक्का वादा
है अस्वीकृत का उपयोग करते हुए अस्वीकार()
(के पैरामीटर के रूप में उपयुक्त त्रुटि संदेश के साथ अस्वीकार()
).
घटना संचालकों के लिए फिर()
तथा पकड़()
तरीकों का पक्का वादा
वस्तु हैं अंत में जोड़ा गया.
जब पक्का वादा
है पूरा, के हैंडलर फिर()
तरीका चलाया जाता है। इसका तर्क है पैरामीटर से पारित कर दिया हल ()
. ईवेंट हैंडलर के अंदर, प्रतिक्रिया पाठ (तर्क के रूप में प्राप्त) है दस्तावेज़ में लिखा है.
जब पक्का वादा
है अस्वीकृत, के ईवेंट हैंडलर पकड़()
तरीका चलाया जाता है, त्रुटि लॉगिंग.
मुख्य लाभ कोड के ऊपर दिए गए संस्करण का संस्करण है गलती संभालना. गैर-प्रचारित संस्करण की तरह अनक्रेडेड अपवाद को फेंकने के बजाय - द उपयुक्त विफलता संदेश लौटकर लॉग इन किया जाता है.
लेकिन, यह सिर्फ नहीं है लौटने का विफलता संदेश लेकिन यह भी अतुल्यकालिक गणना का परिणाम यह वास्तव में हमारे लिए फायदेमंद हो सकता है। यह देखने के लिए, हमें अपने उदाहरण का विस्तार करना होगा.
उदाहरण 2
“गैर Promisified” कोड
इसके बजाय केवल पाठ प्रदर्शित करने से hello.txt
, में चाहता हूं इसके साथ गठबंधन करें “विश्व” शब्द और इसे स्क्रीन पर प्रदर्शित करें 2 सेकंड के टाइम-आउट के बाद. यहाँ मैं उपयोग कोड है:
फ़ंक्शन getTxt () Let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ( 'पाठ / सादे'); xhr.send (); xhr.onload = function () try स्विच (this.status) केस 200: document.write (concatTxt (this.response)); टूटना; केस 404: थ्रो 'फाइल नॉट फाउंड'; डिफ़ॉल्ट: 'फ़ाइल लाने में विफल'; पकड़ (गलत) कंसोल.लॉग (गलत); function concatTxt (res) setTimeout (फंक्शन () रिटर्न (रेस + 'वर्ल्ड'), 2000); getTxt ();
स्थिति कोड 200 पर, concatTxt ()
समारोह को कहा जाता है प्रतिक्रिया पाठ को संक्षिप्त करें “विश्व” शब्द इसे दस्तावेज़ में लिखने से पहले.
लेकिन, यह कोड इच्छानुसार काम नहीं करेगा. setTimeout ()
कॉलबैक फ़ंक्शन संघटित स्ट्रिंग वापस नहीं कर सकते. डॉक्यूमेंट का प्रिंट आउट क्या होगा अपरिभाषित
क्योंकि वह है क्या concatTxt ()
रिटर्न.
“Promisified” कोड
तो, कोड काम करने के लिए, आइए उपर्युक्त कोड का प्रचार करें, समेत concatTxt ()
:
फ़ंक्शन getTxt () नया वादा (फ़ंक्शन (रिज़ॉल्यूशन, रिजेक्ट)) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt')); xhr .overrideMimeType ('टेक्स्ट / प्लेन'); xhr.send (); xhr.onload = function () स्विच (this.status) केस 200: हल (this.response); केस 404: अस्वीकार ('फाइल नहीं मिली'); डिफ़ॉल्ट: अस्वीकार ('विफल) फ़ाइल प्राप्त करें ');;); function concatTxt (txt) नया वादा (फ़ंक्शन (रिज़ॉल्यूशन, रिजेक्ट)) setTimeout (फ़ंक्शन () रिज़ॉल्यूशन (txt +; World ’);; 2000);); getTxt ()। तब ((txt) => कॉन्टेक्ट टैक्स्ट (txt);)। फिर ((txt) => document.write (txt);) पकड़ें ((गलत) = कंसोल) लॉग (ग़लती से;););
बिलकुल इसके जैसा getTxt ()
, concatTxt ()
समारोह भी एक नया लौटाता है पक्का वादा
वस्तु बजाय संक्षिप्त पाठ के। पक्का वादा
द्वारा लौटा दिया गया concatTxt ()
है के कॉलबैक फ़ंक्शन के अंदर हल किया गया setTimeout ()
.
उपरोक्त कोड के अंत के पास, पहले का इवेंट हैंडलर फिर()
विधि तब चलती है जब पक्का वादा
का getTxt ()
है पूरा, यानी जब फाइल हो सफलतापूर्वक लाया गया. उस हैंडलर के अंदर, concatTxt ()
कहा जाता है और यह पक्का वादा
द्वारा लौटा दिया गया concatTxt ()
वापस आ गया है.
दूसरे का इवेंट हैंडलर फिर()
विधि तब चलती है जब पक्का वादा
द्वारा लौटा दिया गया concatTxt ()
है पूरा, यानी द दो सेकंड का समय समाप्त हो गया है तथा हल ()
कहा जाता है संघटक स्ट्रिंग के साथ इसके पैरामीटर के रूप में.
आखिरकार, पकड़()
सभी अपवादों और विफलता संदेशों को पकड़ता है दोनों वादों से.
इस Promisified संस्करण में, “नमस्ते दुनिया” स्ट्रिंग होगी सफलतापूर्वक मुद्रित किया गया दस्तावेज़ के लिए.