हां, वादे अतुल्यकालिक कॉलबैक हैं। वे कुछ भी नहीं कर सकते हैं जो कॉलबैक नहीं कर सकते हैं, और आप समान समस्याओं का सामना करते हैं अतुल्यकालिक के साथ सादे कॉलबैक के साथ।
हालाँकि, वादे केवल कॉलबैक से अधिक हैं । वे एक बहुत शक्तिशाली अमूर्त हैं, कम त्रुटि वाले बायलरप्लेट के साथ क्लीनर और बेहतर, कार्यात्मक कोड की अनुमति देते हैं।
तो मुख्य विचार क्या है?
वादे एक एकल (अतुल्यकालिक) संगणना के परिणाम का प्रतिनिधित्व करने वाली वस्तुएं हैं। वे उस परिणाम को केवल एक बार हल करते हैं । इसका कुछ मतलब है:
वादे एक पर्यवेक्षक पैटर्न लागू:
- आपको कॉलबैक को जानने की आवश्यकता नहीं है जो कार्य पूरा होने से पहले मूल्य का उपयोग करेगा।
- अपने कार्यों के तर्क के रूप में कॉलबैक की अपेक्षा करने के बजाय, आप आसानी से
return
एक वादा वस्तु कर सकते हैं
- वादा मूल्य को संग्रहीत करेगा, और आप जब चाहें पारदर्शी रूप से कॉलबैक जोड़ सकते हैं। रिजल्ट मिलने पर इसे बुलाया जाएगा। "पारदर्शिता" का तात्पर्य है कि जब आपके पास एक वादा होता है और इसमें कॉलबैक जोड़ा जाता है, तो इससे आपके कोड पर कोई फर्क नहीं पड़ता है कि क्या परिणाम अभी तक आया है - एपीआई और अनुबंध समान हैं, कैशिंग / स्मरण को बहुत आसान करते हैं।
- आप आसानी से कई कॉलबैक जोड़ सकते हैं
वादे chainable हैं ( monadic , अगर आप चाहते हैं ):
- यदि आपको उस प्रतिमान को बदलने की आवश्यकता है, जो एक प्रतिज्ञा का प्रतिनिधित्व करता है, तो आप प्रतिज्ञा पर एक परिवर्तन कार्य का नक्शा बनाते हैं और एक नया वादा वापस करते हैं जो रूपांतरित परिणाम का प्रतिनिधित्व करता है। आप इसे किसी भी तरह से उपयोग करने के लिए मूल्य नहीं प्राप्त कर सकते हैं, लेकिन आप वादा के संदर्भ में परिवर्तन को आसानी से उठा सकते हैं । कोई बॉयलरप्लेट कॉलबैक नहीं।
- यदि आप दो एसिंक्रोनस कार्यों को चेन करना चाहते हैं, तो आप
.then()
विधि का उपयोग कर सकते हैं । पहले परिणाम के साथ कॉल करने के लिए कॉलबैक लगेगा, और कॉलबैक रिटर्न के वादे के परिणाम के लिए एक वादा करता है।
जटिल लगता है? एक कोड उदाहरण के लिए समय।
var p1 = api1(); // returning a promise
var p3 = p1.then(function(api1Result) {
var p2 = api2(); // returning a promise
return p2; // The result of p2 …
}); // … becomes the result of p3
// So it does not make a difference whether you write
api1().then(function(api1Result) {
return api2().then(console.log)
})
// or the flattened version
api1().then(function(api1Result) {
return api2();
}).then(console.log)
चपटे जादुई रूप से नहीं आते हैं, लेकिन आप इसे आसानी से कर सकते हैं। आपके भारी नेस्टेड उदाहरण के लिए, (पास) समकक्ष होगा
api1().then(api2).then(api3).then(/* do-work-callback */);
यदि इन विधियों के कोड को देखने से समझने में मदद मिलती है, तो यहां कुछ ही लाइनों में सबसे बुनियादी वादा काम है ।
वादों को लेकर क्या बड़ा उपद्रव है?
वादा अमूर्त कार्यों की बेहतर बेहतर क्षमता की अनुमति देता है। उदाहरण के लिए, then
चेनिंग के लिए अगला , दall
फ़ंक्शन कई समानांतर प्रतीक्षा वाले वादों के संयुक्त परिणाम के लिए एक वादा करता है।
अंतिम लेकिन कम से कम वादे एकीकृत त्रुटि हैंडलिंग के साथ नहीं आते हैं। गणना का परिणाम यह हो सकता है कि या तो वादा एक मूल्य के साथ पूरा हो गया है, या इसे एक कारण के साथ खारिज कर दिया गया है। सभी रचना फ़ंक्शंस इसे स्वचालित रूप से संभालते हैं और वादों की जंजीरों में त्रुटियों का प्रसार करते हैं, ताकि आपको स्पष्ट रूप से हर जगह इसके बारे में परवाह करने की आवश्यकता न हो - एक सादे-कॉलबैक कार्यान्वयन के विपरीत। अंत में, आप सभी घटित अपवादों के लिए एक समर्पित त्रुटि कॉलबैक जोड़ सकते हैं।
वादों में चीजों को बदलने का जिक्र नहीं।
यह वास्तव में अच्छे वादे वाले पुस्तकालयों के साथ काफी तुच्छ है, देखें कि मैं मौजूदा कॉलबैक एपीआई को वादों में कैसे बदलूं?