3

我有这个方法:

def findById(id: String): Customer = {
     (new CustomerDaoEs).retrieve(Id[Customer](id)) onComplete {
      case Success(customer) => customer
      case Failure(t) => {
        throw new InvalidIdException(id.toString, "customer")
      }
    }
  }

当然,问题在于它返回的是 Unit 而不是 Customer ......所以基本上 onComplete 的行为并不像模式匹配。

有什么方法可以继续返回客户(或 Option[Customer])并使这项工作变得更好(我的意思是保持这个 onComplete 干净的结构)?

4

2 回答 2

5

你可以改变exception使用recover方法:

def findById(id: String): Future[Customer] = {
  (new CustomerDaoEs).retrieve(Id[Customer](id)).recover{ case _ => throw new InvalidIdException(id.toString, "customer") }
}

然后你可以像这样使用你的方法:

val customer = Await.result(findById("cust_id"), 5.seconds)

或者,您可以将异常替换为None

def findById(id: String): Future[Option[Customer]] = {
  (new CustomerDaoEs).
    retrieve(Id[Customer](id)).
    map{ Some(_) }.
    recover{ case _ => None }
}
于 2013-04-08T09:55:39.383 回答
4

主要问题是 onComplete 是非阻塞的。因此,您将不得不使用 Await 并返回结果。

def findById(id: String): Customer = 
  Await.result(
    awaitable = (new CustomerDaoEs).retrieve(Id[Customer](id))),
    atMost = 10.seconds
  )

但是我宁愿建议保持代码非阻塞并使 findById return Future[Customer]

于 2013-04-08T09:56:29.327 回答