gpt4 book ai didi

postgresql - 如何在 slick 3 的 DBIOAction 组合中使用 Future?

转载 作者:行者123 更新时间:2023-11-29 11:53:35 25 4
gpt4 key购买 nike

Slick 3 通过使用 flatMap 方法提供了 DBIOAction 组合。此外,我们可以在两个 DBIOAction 之间在后端进行一些计算。这在大多数情况下都很好,但是当计算结果在像 Future 这样的 monad 中时我应该怎么做?有阻塞方式的代码:

val fooQuery = TableQuery[FooTable]
val barQuery = TableQuery[BarTable]

def requestService(content: Iterable[String]): Future[Iterable[Long]] = ???

def modify(ids: Iterable[Long], change: String) = {

val query = fooQuery.filter(_.id inSet ids).result.flatMap{ fooSeq =>
val content = fooSeq.map(_.contentField)
val requestServiceFuture = requestService(content)

val serviceResult = Await.result(requestServiceFuture, 1.minute)
barQuery.filter(_.id inSet serviceResult).delete //or other action
}
db.run(query.transactionally)
}

有没有办法在不等待的情况下异步执行此代码?

最佳答案

您可以使用 DBIOAction.fromFuture 创建 DBIO,然后使用 flatMap

val query = for {
fooSeq <- fooQuery.filter(_.id inSet ids).result
content = fooSeq.map(_.contentField)
serviceResult <- DBIOAction.from(requestService(content))
result <- barQuery.filter(_.id inSet serviceResult).delete
} yield result

db.run(query.transactionally)

http://slick.lightbend.com/doc/3.1.1/api/index.html#slick.dbio.DBIOAction $

关于postgresql - 如何在 slick 3 的 DBIOAction 组合中使用 Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40581767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com