2014-10-14 15 views
13

मैं ReactiveMongo ड्राइवर का उपयोग कर एक स्कैला एप्लिकेशन लिख रहा हूं। डीबी रिटर्न तक पहुंचने वाली विधियां हमेशा Future[T]। कोड के निम्नलिखित टुकड़े बराबर हैं?भविष्य के पूर्ण और flatMap के बीच क्या अंतर है?

(onComplete के साथ)

val results: Future[List[Tag]] = Tags.all.toList 
results onComplete { 
    case Success(list) => //do something with list 
    case Failure(t) => //throw the error 
} 

(flatMap के साथ)

Tags.all.toList.flatMap(list => //do something with list) 

क्या अंतर है?

फ्लैटमैप विफलता को फेंक नहीं देता है ?? और flatMaponComplete जैसा कॉलबैक है या Tags.all.toList कथन पूरा होने तक प्रतीक्षा करें?

+0

यह हस्ताक्षर से स्पष्ट है: इसी प्रकार मोनड का प्रयास करें, 'flatMap' विफलताओं से संबंधित नहीं है। यह मोनैड के बारे में है: आप किसी भी त्रुटि को बरकरार रखते हैं और पाइप में कोई त्रुटि नहीं होने पर ही आपके परिचालनों को लागू करते हैं। केवल अंत में आपको सलाह दी जाती है कि दोनों त्रुटियों और सफलताओं को पकड़ने के लिए –

उत्तर

27

संदेह में, प्रकारों का पालन करें।

onComplete रिटर्न Unit, तो यह आपको Future परिणाम के साथ कुछ करने के लिए अनुमति देता है, लेकिन यह एक मूल्य

flatMap आप सूची साथ कुछ करना और एक नया Future

वापस लौटने देते नहीं लौटेगा तो flatMap अधिक शक्तिशाली है क्योंकि यह आपको कई वायदा श्रृंखला, रास्ते में उनके मूल्यों के साथ कुछ करने की अनुमति देता है, और केवल अंत में विफलता के मामले को संभालने की अनुमति देता है। एरिक मीजर के शब्दों का उपयोग करने के लिए: "यह आपको खुश रास्ते के माध्यम से मार्गदर्शन करता है"।

तो उदाहरण के लिए आप

val finalFuture = results 
.flatMap(x => /* do something and return a future */) 
.flatMap(y => /* do something else and return a future */) 
.flatMap(z => /* do something else and return a future */) 
.map(myresult => /* do something */) 

क्या कर सकते हैं कुछ रास्ते में गलत हो जाता है, चेन जल्दी टूट गया है और आप पहले त्रुटि हुई मिलेगा। और भी बेहतर - - बस Future वापसी के रूप में यह पहले से ही हैं, इस पर जानकारी शामिल है

यह

val finalFuture = for { 
    x <- results 
    y <- /* do something and return a future */ 
    z <- /* do something and return a future */ 
} yield something(z) 

आप विफलता के मामले को संभालने के लिए की जरूरत है, तो आप अब onComplete उपयोग कर सकते हैं, या एक और भी अच्छे वाक्य रचना के लिए अनुमति देता है async गणना सफल या नहीं।

+1

उत्कृष्ट उत्तर दें। आज मेरी मदद की –

+1

"जब संदेह है, तो प्रकारों का पालन करें।" अंगूठे – mulya

+0

का एक अच्छा नियम है इस उदाहरण में, फाइनल फ्यूचर एक भविष्य [कुछ भी नहीं] देता है इससे कोई फर्क नहीं पड़ता कि किस प्रकार का प्रकार (जेड) है। क्या होगा यदि आपको कुछ (जेड) पास करने की ज़रूरत है: टी टी की उम्मीद करने के लिए टी? – Azeli

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