for {
Some(article) <- articleService.get(id) // returns Future[Option[Article]]
Some(account) <- accountService.get(article.authorId) // resturns Future[Option[Account]]
} yield ArticleDetail(article, account)
这种方式很简单但不安全,因为Some(article)
和Some(account)
可能会抛出NoSuchElementException
当然我们可以使用flatMap
像这样重写它
articleService.get(id).flatMap {
case Some(article) => accountService.get(article.authorId).map(ArticleDetail(article, _))
case None =>
Future.successful(None)
}
但不是那么直截了当
有一种安全而简单的方法吗?