如何在Scala中组合2个期货
我正在编写一个CRUDRESTAPI,在服务层上合并两个未来时遇到了一个问题 其思想是将实体插入数据库,然后通过id检索由db生成的所有值 我试过了,但它不能返回Future[Entity],它说它仍然是Future[Long]如何在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
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_是的,我看到了。谢谢你的纠正,我否决了反对的旁观者。