फ्यूचर और प्रॉमिस में क्या अंतर है?


73

भविष्य और प्रतिज्ञा में क्या अंतर है? (अक्का और गपर में।)

वे मुझे दोनों ब्लॉक के रूप में समान दिखते हैं और जब बुलाया जाता है तो भविष्य का मूल्य वापस करते हैं और भविष्य का परिणाम प्राप्त करने का वादा करते हैं।


4
"भविष्य का वादा निर्माता उपभोक्ताओं"। (लेकिन प्रोग्रामिंग के लिए, अंतिम दो को स्वैप करें क्योंकि फ्यूचर्स (शून्य या अधिक) एक मूल्य की खपत के अनुरूप है, और वादा (केवल पहला सफल होने में सक्षम) एक मूल्य का उत्पादन करने के लिए अनुरूप है।)
rwong

मार्टिन ओडस्की, एरिक मीजेर, रोलैंड कुहन: क्लास.कौरसेरा.ओआर / आर्कटिक-001 / lecture , वीक 3
जीकिस्लिन

@rwong: "भविष्य के वादे निर्माता उपभोक्ताओं" - हुह? क्या इसका मतलब एक सार्थक वाक्य है जो हमें वायदा और वादों के बीच के अंतर को याद दिलाने के लिए एक महामारी के रूप में कार्य करता है? मेरा दिमाग इसे पार्स करने में पूरी तरह से विफल रहा है। और आप यह भी कह रहे हैं कि यह गलत है और शब्दों की अदला-बदली की जरूरत है, लेकिन किसी कारण से आपने इसे टाइप करने से पहले ऐसा नहीं किया है। और अंत में यह उद्धरण में है, लेकिन यह आपकी टिप्पणी के अलावा कोई हिट नहीं लाता है। मेगा-विस्मित कर दिया।
बेकर

जवाबों:


54

मैं अक्का / स्काला के बारे में बात करूंगा, क्योंकि मैं न तो गपर से परिचित हूं और न ही अक्का / जावा से।

स्केल 2.10 में, जिसमें मानक वितरण में अक्का का प्रासंगिक हिस्सा शामिल है, Futureयह अनिवार्य रूप से एक अभी तक-गणना मूल्य के लिए केवल-पढ़ने के लिए संदर्भ है। एक Promiseबहुत ही एक ही है सिवाय इसके कि आप इसे भी लिख सकते हैं । दूसरे शब्दों में, आप Futures और Promises दोनों से पढ़ सकते हैं , लेकिन आप केवल Promises पर लिख सकते हैं । आप इस पर विधि को कॉल करके Futureसंबंधित को प्राप्त कर सकते हैं , लेकिन दूसरी दिशा में रूपांतरण संभव नहीं है (क्योंकि यह निरर्थक होगा)।Promisefuture



19

विकिपीडिया के अनुसार , वे एक ही अवधारणा हैं:

कंप्यूटर विज्ञान में, भविष्य, वादा, और देरी कुछ समवर्ती प्रोग्रामिंग भाषाओं में सिंक्रनाइज़ करने के लिए उपयोग किए जाने वाले निर्माणों को संदर्भित करता है। वे एक वस्तु का वर्णन करते हैं जो एक परिणाम के लिए एक प्रॉक्सी के रूप में कार्य करता है जो शुरू में अज्ञात है, आमतौर पर क्योंकि इसके मूल्य की गणना अभी तक अधूरी है।

कुछ पुस्तकालय उन्हें एक तरह से कॉल करना चुन सकते हैं, कुछ उन्हें दूसरे को कॉल करना चुन सकते हैं। और हर बार, उन्हें अलग-अलग स्वादों में लागू किया जा सकता है। कुछ पुस्तकालय अलग-अलग स्वादों को अलग करने के लिए इन समानार्थी शब्दों का उपयोग करना चुन सकते हैं। हालांकि मैं तर्क दूंगा कि यह एक बुरा विकल्प है (क्योंकि जाहिर है कि यह लोगों को भ्रमित करता है), इस लिंक से पता चलता है कि स्काला में यह आम प्रथा है।

जैसा कि @ Ptharien की लौ का सुझाव दिया है, स्काला में एक Futureकेवल-पढ़ने वाला ऑपरेशन है, जबकि Promiseयह आपको उस ऑपरेशन के लिए परिणाम (या विफलता) प्राप्त करने की क्षमता देता है जो इसका प्रतिनिधित्व करता है।

एक Promise, जबकि एक, सबसे अच्छा कोड परिणाम प्रचार करने के लिए प्रक्रिया निष्पादित करने के जिम्मेदार द्वारा प्रयोग किया जाता है इस प्रकार है Futureग्राहक कोड के लिए इसे बेनकाब करने के लिए, कि बारी में परिणाम का इंतजार किया जाता है। लेकिन फिर से, कृपया ध्यान दें कि यह अंतर स्काला विशिष्ट है और बाहरी लोगों को भ्रमित कर सकता है।


जेएस प्रोमिस और पायथन फ्यूचर्स के लिए भी यही स्थिति है।
निक स्वीटिंग

6

मैं यहां थोड़ा जोड़ दूंगा क्योंकि मैं देर से जावा में फ्यूचर्स के ढेरों के साथ काम कर रहा हूं, लेकिन साथ ही साथ स्काला / अक्का विकास में एक पृष्ठभूमि है। यह उत्तर अधिकतर वही कहा जाएगा जो जेवीएम पर आज लोकप्रिय उपयोग में कार्यान्वयन के ढेरों को इंगित करेगा।

सबसे पहले, मूल पोस्टर का उपयोग करें और अवरुद्ध करें - कृपया कभी भी परीक्षणों के बाहर ऐसा न करें।

जब मैं अपनी वर्तमान भूमिका में एफपी और कॉनसेरी अवधारणाओं को सिखाता हूं, तो मैं सबसे पहले छात्र को बताता हूं कि शब्दार्थ वादे और वायदे समानार्थक हैं क्योंकि एक वादे के उपभोक्ता या भविष्य के एपी के रूप में, डेवलपर को यह समझने की आवश्यकता नहीं है कि वहां हैं या यदि वहां हैं या नहीं? सिमेंटिक अंतर - IO को अवरुद्ध किए बिना उन्हें संभालने के लिए केवल यांत्रिकी।

यह कहने के लिए कि एक भविष्य पूरा नहीं हो सकता है और यह वादा कर सकता है (उदाहरण के लिए scala / akka / play apis के अनुसार) बहुत सरल है:

कुछ वायदा को पूरा किया जा सकता है Java8 अब मानक पुस्तकालय में एक कंप्लीटटेबल सिवनी का परिचय देता है।

कुछ वादे पूरे नहीं किए जा सकते। इसी तरह, प्ले वादे एपीआई में एक वादा पूरा नहीं किया जा सकता है, लेकिन एक रिडीमेबल प्रॉमिस इसलिए एक अलग अर्थ का परिचय दे सकता है - यहां तक ​​कि टाइपसेफ छाता के तहत भी। इसके अलावा, प्ले वादा एपीआई दोनों दिशाओं में स्केला फ्यूचर्स के साथ परिवर्तित कर सकता है - (F.Promise.wrap (भविष्य) या वादा। क्रैप्ड ())।

Java8 पर टाइपसैफ़ तकनीक के साथ काम करना आप अक्सर वायदा / वादों के बीच आगे-पीछे करेंगे क्योंकि एक एपीआई बेहतर है (प्ले प्रोमिस एपीआई Java8 लैम्ब्डा के साथ बेहतर लगता है)। अक्का + प्ले + जावा 8 पर आप एक्टर्स से फ्यूचर ले रहे होंगे और उन्हें वादों में लपेटेंगे, कॉलबैक की रचना करेंगे और नियंत्रक से वापस करेंगे।

इसलिए, जैसा कि मैं लोगों को बताता हूं जब मैं पढ़ाता हूं, तो वादे और वायदे कम या ज्यादा समानार्थी हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.