2014-09-17 13 views
0

데이터베이스에서 레코드를 읽는 데 사용하는 다음 코드 스 니펫이 있는데 ReactiveMongo를 사용하고 있습니다.스칼라에서 미래의 가치 실현하기

val futureList: Future[Option[BSONDocument]] = collection.find(query).cursor[BSONDocument].headOption 

val os: Future[Option[Exam]] = futureList.map { 
    (list: Option[BSONDocument]) => list match { 
    case Some(examBSON) => { 
     val id = examBSON.getAs[Int]("id").get 
     val text = examBSON.getAs[String]("text").get 
     val description = examBSON.getAs[String]("description").get 
     val totalQuestions = examBSON.getAs[Int]("totalQuestions").get 
     val passingScore = examBSON.getAs[Int]("passingScore").get 
     Some(Exam(id, text, description, totalQuestions, passingScore)) 
    } 
    case None => None 
    } 
}.recover { 
    case t: Throwable => // Log exception 
    None 
} 

미래를 반환하기 위해 메소드 서명을 변경하고 싶지 않습니다. 나는 미래의 가치를 얻고 그것을 호출자에게 돌려주고 싶다.

import scala.concurrent.duration._ 

val os: Future[Option[Exam]] = ??? 
val result = Await.result(os, 10 seconds) 
result.getOrElse(/* some default */) 

미래가 완료되거나 제한 시간이 만료 예외가 슬로우 될 때까지 스레드를 차단합니다 차단, 노트이 좀 패배 있다는 것을 :

답변

1

당신은 awaitable 객체를 사용하여 차단 한 후 필요 비동기 계산을하기위한 목적이지만 사용 사례에 따라 다를 수 있습니다.

당신이 결과를 필요로하지 않는 경우 결과도 반환 즉시 액세스 할 수없는, 그래서 즉시 미래가 완료되면 onComplete은 해고 될 것이라고 onComplete

os onComplete { 
    case Success(someOption) => myMethod(someOption) 
    case Failure(t) => println("Error) 
} 

주를 사용하여 콜백을 첨부 할 수 있습니다 유형은 Unit입니다.

+1

내 의견으로는 Future를 사용하는 모든 목적을 저 버린다. Try of an Option의 옵션을 제공하는 value라는 메소드가 있다는 것을 알았습니다. – sparkr

+0

'value'를 사용하면 미래가 완료되지 않은 경우'None'을 반환하고, 그럴 경우 그 결과가 솔직하게 나타 났는지 확신 할 수 없습니다. –

+7

진짜 문제는 내가 생각하기에 당신이 블로킹없이 비동기 계산의 결과를 원한다고 생각하는 것입니다. 이미 비논리적 인 문장을 만들었습니다. 비동기 계산은 미래에 결과를 반환 할 것입니다. 꽤 지시적이다.) 만약 당신이 그 결과를 기다리고 싶다면, 기다려야하고 막아야한다. 정말로 그 주위에는 다른 방법이 없다. 결과에 따라 무엇을 하느냐에 따라'onComplete'와 같은 콜백을 사용할 수 있지만, 이는 당신의 요구에 달려 있습니다. –