如何在Slick 3中的DBIOAction组成内使用Future?

Sto*_*ran 2 postgresql scala slick slick-3.0

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)
} 
Run Code Online (Sandbox Code Playgroud)

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

Łuk*_*asz 8

您可以创建DBIOFuture使用DBIOAction.from,然后使用与其他DBIOs撰写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)
Run Code Online (Sandbox Code Playgroud)

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