如何在Scala中组合2个期货

如何在Scala中组合2个期货,scala,future,Scala,Future,我正在编写一个CRUDRESTAPI,在服务层上合并两个未来时遇到了一个问题 其思想是将实体插入数据库,然后通过id检索由db生成的所有值 我试过了,但它不能返回Future[Entity],它说它仍然是Future[Long] class Service { def find(id: Long): Future[Option[Entry]] = db.run(repo.findEntry(id)) //TODO Fails: Expression of type Future[Lon

我正在编写一个CRUDRESTAPI,在服务层上合并两个未来时遇到了一个问题

其思想是将实体插入数据库,然后通过id检索由db生成的所有值

我试过了,但它不能返回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()
}
我觉得答案很简单,但就是找不到

然后是副作用,它仍然返回第一个未来的原始结果

你想要平面图

flatMap还带有一种特殊的语法,大多数人在习惯了这种语法后会发现它更具可读性,尤其是在有更多步骤的情况下:

 for {
   id <- db.run(repo.insertEntry())
   entry <- find(id)
 } yield entry
对于副作用,它仍然返回第一个未来的原始结果

你想要平面图

flatMap还带有一种特殊的语法,大多数人在习惯了这种语法后会发现它更具可读性,尤其是在有更多步骤的情况下:

 for {
   id <- db.run(repo.insertEntry())
   entry <- find(id)
 } yield entry

试图编辑yield id以生成条目,因为这看起来像是一个明显的打字错误,但一些在scala或相关FP标记中没有活动的用户都拒绝了它。我有点生气,所以给回答者或更高级别的karma scala用户留下评论,如果他们同意,可以编辑。@Score_是的,我看到了。感谢您的更正,我推翻了反对的旁观者。我试图编辑yield id以产生条目,因为这看起来像是一个明显的打字错误,但一些在scala或相关FP标记中没有活动的用户都拒绝了它。我有点生气,所以给回答者或更高级别的karma scala用户留下评论,如果他们同意,可以编辑。@Score_是的,我看到了。谢谢你的纠正,我否决了反对的旁观者。