如何从数据库优雅地初始化Scala服务?

时间:2020-10-09 20:12:04

标签: scala monads future optional

我离开Scala已有一段时间了,所以我正试图重新回到惯用语上。我有三个数据库调用:

db.getInventory(inventoryId: UUID): Future[Option[Inventory]]
db.getInventoryFields(inventoryId: UUID): Future[Seq[InventoryField]]
db.allInputs: Future[Seq[Input]]

如果db.getInventorySome(inventory),我想通过给它一个服务来初始化我的服务

CacheContext(inventory: Inventory, fields: Seq[InventoryField], inputs: Seq[Input])

但是如果它不是None,我想报告并返回错误。

在这里使用for / map / flatMap / fold等的最佳组合是什么?

1 个答案:

答案 0 :(得分:2)

这将返回std::shared_ptr

Future[Option[CacheContext]]

for { optInv <- db.getInventory(theUuid) invFlds <- db.getInventoryFields(theUuid) inputs <- db.allInputs } yield optInv.map(CacheContext(_,invFlds,inputs)) 的解压缩(即等待)应该在代码的后面(如果有的话)完成,此时,您可以在Future.fold()并报告错误。 / p>