2016-11-14 7 views
2

Slick 3 предлагает композицию DBIOAction с использованием метода flatMap. Кроме того, мы можем сделать некоторые вычисления в фоновом режиме между двумя DBIOActions. В большинстве случаев это прекрасно работает, но что делать, когда результаты вычислений происходят в монаде, таком как Future? Существует код с блокировкой:Как использовать Будущее внутри композиции DBIOAction в slick 3?

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

Есть ли способ выполнить этот код асинхронно, без Await?

ответ

3

Вы можете создать DBIO из Future с помощью 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) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^