2016-11-14 12 views
2

Slick 3は、flatMapメソッドを使用してDBIOAction合成を提供します。また、2つのDBIOアクション間でバックエンドで計算を行うこともできます。それはほとんどの場合うまくいきますが、計算結果が将来のようなモナドにあるときに何をすべきですか?slick 3のFuture Inside DBIOAction構成の使用方法は?

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

あなたはDBIOAction.fromを使用してFutureから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を使用して他のDBIOSで構成することができます

関連する問題