2017-08-01 63 views
0

我的代碼結構如下。這只是一個例子複製的高水平structure.:-如何從Scala獲取價值未來onComplete/onSuccess

import scala.concurrent.Future 


class FutureReturnsAValue extends PersonAgeModifier { 
    def main(args: Array[String]) { 

    val jhonObj = Person("Jhon", 25) 

    val punishmentResult = addAgeCurse(jhonObj) 
    println("The punishment result for Jhonny is " + punishmentResult) 

    } 

    def addAgeCurse(person: Person): String = { 

    val oldAge = person.age 
    val futureAge = LongProcessingOpForAge(person) 
    futureAge.onSuccess { 

     newAge => 

     if (newAge = oldAge + 5) { 
      "screw the kiddo, he aged by 5 years" // somehow return this string 
     } 

     else { 
      "lucky chap, the spell did not affect him" // somehow return this string 
     } 
    } 

    } 
} 

class PersonAgeModifier { 

    def LongProcessingOpForAge(person: Person): Future[Int] = { 
    Future.successful { 
     person.age + 5 
    } 
    } 
} 


case class Person 
(
    val name: String, 
    var age: Int 

) 

object Person { 
    def apply(name: String, age: Int) = new Person(name, age) 

} 

所以我的要求是這樣的: - 我需要從addAgeCurse()方法的字符串。現在我知道你可能會建議將未來值LongProcessingOpForAge()傳遞給main(),但這不是我想要的。

問題:

  1. 什麼是獲得字符串,並將其傳遞給main()的最徹底的方法。 (通過乾淨,我的意思是一些不使用的等待時間X作爲參與我想,以避免任何人工干預。)

感謝

+0

你將不得不等待未來在某個地方完成。你可以改變你的函數來返回一個未來,然後在main中等待,或者等待這個函數。 – Tyler

+0

或者撰寫而不是等待 – cchantep

+0

@cchantep,這裏如何撰寫幫助。你能提供更多的信息嗎?謝謝 – BigDataScholar

回答

0

也許你問:

scala> import concurrent._, ExecutionContext.Implicits._ 
import concurrent._ 
import ExecutionContext.Implicits._ 

scala> def f = Future(42) 
f: scala.concurrent.Future[Int] 

scala> def g = f.map(_ + 1) 
g: scala.concurrent.Future[Int] 

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

object Main extends App { 
    for (i <- g) println(i) 
} 

// Exiting paste mode, now interpreting. 

defined object Main 

scala> Main main null 
43 

這是一個簡單的方法來阻止你的答案。主線程在它擁有之前不會退出。使用map來轉換未來值。