वहाँ वास्तव में एक बहुत महत्वपूर्ण अंतर है, jQuery के Deferreds के रूप में insofar वादा (और jQuery3.0 वास्तव में उन्हें कल्पना में लाने की कोशिश करता है) का एक कार्यान्वयन होने का मतलब है।
किया / तब के बीच महत्वपूर्ण अंतर यह है कि
.done()
ALWAYS वही वादा / लिपटे हुए मूल्यों को देता है, जो आपने शुरू किया था, भले ही आप क्या करें या क्या लौटाएं।
.then()
हमेशा एक नया वादा लौटाता है, और आप इस बात को नियंत्रित करने के प्रभारी होते हैं कि जो वादा आपने पारित किया है, उस पर आधारित है।
JQuery से देशी ES2015 वादों में अनुवादित, .done()
एक प्रकार का "संरचना" एक वचन श्रृंखला में एक फ़ंक्शन के चारों ओर लागू करने की तरह है, उस में, यदि श्रृंखला "समाधान" स्थिति में है, तो फ़ंक्शन के लिए एक मान पास करें। लेकिन उस फ़ंक्शन का परिणाम श्रृंखला को स्वयं प्रभावित नहीं करेगा।
const doneWrap = fn => x => { fn(x); return x };
Promise.resolve(5)
.then(doneWrap( x => x + 1))
.then(doneWrap(console.log.bind(console)));
$.Deferred().resolve(5)
.done(x => x + 1)
.done(console.log.bind(console));
वे दोनों 5 नहीं, 6 लॉग करेंगे।
ध्यान दें कि मैंने लॉगिंग करने के लिए किया और किया हुआ है। ऐसा इसलिए है क्योंकि कंसोल.लॉग फ़ंक्शन वास्तव में कुछ भी वापस नहीं करते हैं। और यदि आप पास हो जाते हैं, तो एक फ़ंक्शन जो कुछ भी वापस नहीं करता है, तब क्या होता है?
Promise.resolve(5)
.then(doneWrap( x => x + 1))
.then(console.log.bind(console))
.then(console.log.bind(console));
वह लॉग करेगा:
5
अपरिभाषित
क्या हुआ? जब मैंने इसका इस्तेमाल किया था। और इसे एक फंक्शन पास कर दिया, जिसमें कुछ भी वापस नहीं आया, तो यह निहित परिणाम "अपरिभाषित" था ... जो निश्चित रूप से एक वादा [अपरिभाषित] अगले तत्कालीन विधि पर लौटा, जो अपरिभाषित लॉग ऑन किया। इसलिए हमने जो मूल मूल्य शुरू किया था, वह मूल रूप से खो गया था।
.then()
दिल में, फ़ंक्शन संरचना का एक रूप है: प्रत्येक चरण का परिणाम अगले चरण में फ़ंक्शन के तर्क के रूप में उपयोग किया जाता है। यही कारण है कि .done को "टैप" के रूप में सबसे अच्छा माना जाता है -> यह वास्तव में रचना का हिस्सा नहीं है, बस कुछ ऐसा है जो एक निश्चित कदम पर मूल्य को देखता है और उस मूल्य पर एक फ़ंक्शन चलाता है, लेकिन वास्तव में बदलता नहीं है किसी भी तरह से रचना।
यह एक बहुत ही मौलिक अंतर है, और शायद एक अच्छा कारण है कि देशी वादों के पास एक .done पद्धति खुद को लागू नहीं करती है। हम पूर्व संध्या में नहीं है कि वहाँ .fail विधि क्यों है, क्योंकि यह और भी अधिक जटिल है (अर्थात् .fail / / .catch .done / .then के दर्पण नहीं हैं -> .catch में कार्य जो नंगे मानों को वापस करते हैं। "स्टे" को उन लोगों की तरह खारिज कर दिया गया, जिन्हें वे पास कर चुके हैं, वे हल करते हैं! "