如何在Scala中结合2个期货

时间:2019-01-28 09:31:58

标签: scala future

我正在编写一个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()
}

我觉得答案很简单,但找不到答案。

1 个答案:

答案 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