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 */)
주
미래가 완료되거나 제한 시간이 만료 예외가 슬로우 될 때까지 스레드를 차단합니다 차단, 노트이 좀 패배 있다는 것을 :
내 의견으로는 Future를 사용하는 모든 목적을 저 버린다. Try of an Option의 옵션을 제공하는 value라는 메소드가 있다는 것을 알았습니다. – sparkr
'value'를 사용하면 미래가 완료되지 않은 경우'None'을 반환하고, 그럴 경우 그 결과가 솔직하게 나타 났는지 확신 할 수 없습니다. –
진짜 문제는 내가 생각하기에 당신이 블로킹없이 비동기 계산의 결과를 원한다고 생각하는 것입니다. 이미 비논리적 인 문장을 만들었습니다. 비동기 계산은 미래에 결과를 반환 할 것입니다. 꽤 지시적이다.) 만약 당신이 그 결과를 기다리고 싶다면, 기다려야하고 막아야한다. 정말로 그 주위에는 다른 방법이 없다. 결과에 따라 무엇을 하느냐에 따라'onComplete'와 같은 콜백을 사용할 수 있지만, 이는 당신의 요구에 달려 있습니다. –