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")
      }
    }
  }

もちろん、問題は、これが Customer ではなく Unit を返すことです... したがって、基本的に onComplete は実際にはパターン マッチングのようには動作しません。

Customer (または 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 に答える