2015-06-05 6 views
10

andThen जिसका अर्थ है कि मैंने इस answer से सीखा है एक फ़ंक्शन संगीतकार है।भविष्य का एंडन क्यों परिणाम नहीं लेता है?

कहो कि

f andThen g andThen h 

h(g(f(x))) 

करने के बराबर होगा इसका मतलब है h function से g(f(x))

इनपुट प्राप्त होगा लेकिन Future में andThen, निम्नलिखित andthen के सभी बंद करने के लिए हमेशा मूल Future से परिणाम प्राप्त करता है।

Future{ 
    1 
}.andThen{ case Success(x) => 
    println(x) // print 1 
    Thread.sleep(2000) 
    x * 2 
}.andThen{ case Success(x) => 
    println(x) // print 1 
    Thread.sleep(2000) 
    x * 2 
} 

val func: Function1[Int, Int] = { x: Int => 
    x 
}.andThen { y => 
    println(y) // print 1 
    y * 2 
}.andThen { z => 
    println(z) // print 2 
    z * 2 
} 
func(1) 

से तुलना क्या बनाने के लिए भविष्य :: andthen (रों) सभी एक ही परिणाम मूल भविष्य से बजाय भविष्य चेनिंग की प्राप्त कारण क्या है? मैंने देखा है कि इन जंजीरों और फिर क्रमशः निष्पादित किया जाएगा, इसलिए कारण समानांतर उद्देश्य के लिए नहीं हो सकता है।

उत्तर

14

scala.concurrent.Future दो अतुल्यकालिक तरीकों में से समझौता के रूप में बनाया गया है:

  1. वस्तु उन्मुख observer जो अतुल्यकालिक संचालकों
  2. कार्यात्मक monad जो अमीर कार्यात्मक रचना क्षमता प्रदान करता है के बंधन की अनुमति देता है।

पढ़ना Future.andThen's docs:

यह भविष्य के परिणाम के पक्ष प्रभावशाली समारोह लागू होता है, और यह भविष्य के परिणाम के साथ एक नया भविष्य देता है।

तो andThen ओओपी ब्रह्मांड से सबसे अधिक संभावना है। Function1.andThen के लिए इसी तरह समान परिणाम प्राप्त करने के लिए आप map विधि इस्तेमाल कर सकते हैं:

Future(1).map {_ * 2}.map {_ * 2} 

andThen एक छोटी बात के साथ onComplete से अलग है: andThen का भविष्य जिसके परिणामस्वरूप अभी भी एक ही परिणाम लौटने, लेकिन जब तक आपूर्ति की पर्यवेक्षक वापसी या कुछ फेंक होगा इंतजार करेंगे। यही कारण है कि दस्तावेज़ों में लिखा गया है:

यह विधि किसी को यह लागू करने की अनुमति देती है कि कॉलबैक निर्दिष्ट आदेश में निष्पादित किया गया है।

इसके अलावा डॉक्स से तीसरी लाइन पर ध्यान दें:

ध्यान दें कि यदि श्रृंखलित andthen कॉलबैक में से एक एक अपवाद फेंकता है, कि अपवाद बाद andthen कॉलबैक में प्रचारित नहीं किया गया है। इसके बजाए, बाद में और फिर कॉलबैक को इस भविष्य के मूल मूल्य दिए गए हैं।

तो यह 'Future के परिणाम के साथ पूरी तरह से कुछ भी नहीं करता है। इसे अपने स्वयं के अपवाद के साथ भी खराब नहीं कर सका। यह andThen और onComplete पर्यवेक्षकों के अनुक्रमिक और समांतर बाध्यकारी।

+1

क्या मैं कह सकता हूं कि यह पूर्ण संस्करण का एक और संस्करण है लेकिन "यह" लौटाता है ताकि यह चेनिंग शैली में एकाधिक "पर्यवेक्षक" कॉलबैक हैंडलर को बाध्य कर सके? –

+0

@ चेनॉट हां। बहुत अधिक – Odomontois

+0

@ लेकिन एक अंतर के साथ। मैं इसे – Odomontois

संबंधित मुद्दे