2015-07-06 7 views
7

मैं Future का उपयोग करके कुछ बुनियादी कार्यों को एक चिकना कार्रवाई से वापस करने की कोशिश कर रहा हूं और मैं कुछ सुंदर मामूली ब्लॉकों को मार रहा हूं।Future.onSuccess को आंशिक फ़ंक्शन की आवश्यकता क्यों होती है

andThen और onSuccess दोनों विधियों को PartialFunction पैरामीटर के रूप में पारित करने की आवश्यकता होती है। मेरी समझ शायद काफी त्रुटिपूर्ण है लेकिन anonymous functions पढ़ने के बाद ऐसा लगता है कि andThen को किसी भी Success या Failure इनपुट के साथ अपने अज्ञात फ़ंक्शन को जानने की आवश्यकता है।

onSuccess दिए गए Success मामले के लिए पहले से ही केवल PartialFunction होने की आवश्यकता क्यों है?

कोड के इस ब्लॉक समस्या मैं कर रहा हूँ से संकेत मिलता है मेरे में:,

[error] found : Unit => Unit 
[error] required: PartialFunction[Unit,?] 
[error]   .onSuccess { println(_) } 
+1

कि @cmbaxter है 'onComplete', नहीं' onSuccess'। मेरा अनुमान: 'विफलता' के साथ स्थिरता। –

+0

2.11.6 - ये [डॉक्स] (http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.concurrent.Future) आंशिक कार्य का सुझाव देते हैं? – GoldenFish

+0

मुझे लगता है कि बेहतर सवाल यह है कि 'ऑनम्प्ले' क्यों आंशिक कार्य नहीं करता है? मुझे लगता है कि अन्य 3 को दिमाग की स्थितियों के साथ दुष्प्रभाव के साथ रखा गया था और पीएफ परिस्थितियों (पैटर्न मिलान) के लिए अच्छे हैं। मुझे यकीन नहीं है कि क्यों 'पूर्ण पर' ('यूनिट' को रिटर्न प्रकार के रूप में दिए गए दुष्प्रभाव के लिए भी प्रतीत होता है) सूट का पालन नहीं किया गया। – cmbaxter

उत्तर

3

वे इसे किया है ताकि आप परिणाम पर पैटर्न मैच है, हालांकि मैं मानता हूँ कि यह अनावश्यक लगता है, मैं वास्तव में onSuccess का उपयोग नहीं करते कर सकते हैं और मेरे वायदा map और flatMap करना पसंद करते हैं:

val f = Future.successful("test") 

    f.onSuccess({ 
    case "test" => println("Worked") 
    case x: String => println(s"Kind of worked: $x") 
    }) 

में और अधिक उन्नत डेटा प्रकार के मामले मैं इस और अधिक उपयोगी किया जा रहा है देख सकते हैं:

val fOpt = Future.successful(Option("Test")) 

    fOpt.onSuccess({ 
    case Some(x) => println(x) 
    case None => println("None") 
    }) 

सच यह शायद सिर्फ अभिनेता एपीआई से के बाद से जब आप ask एक अभिनेता आप k नहीं है आ रहा है अब वापसी प्रकार, आप उस पर पैटर्न मैच की जरूरत है, क्योंकि यह Any है:

val actor:ActorRef = ??? 

    val fAny = actor ? "asking" 

    fAny.onSuccess({ 
    case x:String => println(s"Something String $x") 
    case x:Int => println(s"Something Int $x") 
    case x => println(s"Something else $x") 
    }) 
+1

नहीं देख रहा हूं, हालांकि, आप नियमित कार्यों के लिए पैटर्न मिलान सिंटैक्स का भी उपयोग कर सकते हैं। – Owen

+0

@ ओवेन: हाँ, यही मुझे भी पहेली है। यदि मैं पैटर्न को आंशिक फ़ंक्शन से मिलान/पास करना चाहता हूं, तो मैं इसे किसी भी समय कर सकता हूं। हमें कभी भी आंशिक कार्य को तर्क प्रकार के रूप में क्यों चाहिए? – kornfridge

1

ठीक है, तुम सिर्फ यह एक PartialFunction पारित कर सकते हैं, यदि यह एक जरूरत है:

val db = Database.forConfig("h2mem1") 

try { 
    val f = db.run(setupCommands) 
    .onSuccess { println(_) } 

    Await.ready(f, 10.seconds) 
} 
finally db.close 

मैं एक संकलन त्रुटि मिलती है :

db.run(setupCommands).onSuccess(PartialFunction(println)) 

या:

db.run(setupCommands).onSuccess { case result => println(result) } 
+2

यह सिर्फ अनावश्यक रूप से सुरुचिपूर्ण लगता है ... मुझे यकीन है कि मुझे कोई कारण नहीं है कि मैं – GoldenFish

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