【问题标题】:How to use Future inside DBIOAction composition in slick 3?如何在 slick 3 中的 DBIOAction 组合中使用 Future?
【发布时间】:2016-11-14 04:10:46
【问题描述】:

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

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)
} 

有没有办法异步执行此代码,无需等待?

【问题讨论】:

    标签: postgresql scala slick slick-3.0


    【解决方案1】:

    您可以使用DBIOAction.fromFuture 创建DBIO,然后使用flatMap 与其他DBIO 组合

    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$

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2017-04-07
      • 2016-01-12
      • 2016-11-10
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多