我正在编写一个CRUD Rest API,并在服务层上合并2个Futures时遇到问题。
这个想法是将Entity插入db,然后通过id检索所有由db值生成的。
我尝试了Java中的andThen(),但它无法返回Future [Entity],它仍然是Future [Long]
class Service {
def find(id: Long): Future[Option[Entry]] = db.run(repo.findEntry(id))
//TODO Fails: Expression of type Future[Long] doesn't conform to expected type Future[Option[Entity]]
def insert(): Future[Option[Entry]] = db.run(repo.insertEntry())
.andThen { case Success(id) =>
find(id)
}
}
class Repository {
def findEntry(id: Long): DBIO[Option[Entry]] =
table.filter(_.id === id).result.headOption
def insertEntry()(implicit ec: ExecutionContext): DBIO[Long] =
table returning table.map(_.id) += Entry()
}
我觉得答案很简单,但找不到答案。
答案 0 :(得分:6)
andThen
是副作用,它仍然返回(第一个Future的)原始结果。
您想要flatMap
。
db.run(repo.insertEntry())
.flatMap( id => find(id) )
flatMap
还具有一种特殊的语法,大多数人(习惯了之后)会发现它们更具可读性,尤其是在有更多步骤的情况下:
for {
id <- db.run(repo.insertEntry())
entry <- find(id)
} yield entry