Будущее не работает в Slick 3.1.x
Эта функция в Slick печатает только "до будущего", она ничего не печатает внутри future.map
; кажется, что будущее никогда не исполняется, есть идеи, в чем может быть проблема?
Примечание: я использую Slick отдельно, а не в Play
def readMany = {
val db = Database.forURL("jdbc:mysql://localhost:3306/dddd",
driver="com.mysql.jdbc.Driver", user="root", password="xxx")
val query = TableQuery[TableDB]
val action = query.sortBy(_.name).result
val future = db.run(action.asTry)
println("before future")
future.map{
case Success(s) => {
s.map {
row => SomeRow ( row.col1, row.col2 )
}
println("s:" + s)
}
case Failure(e) => throw new Exception ("Failure in readMany: " + e.getMessage)
case _ => println("???")
}
}
2 ответа
Прежде всего case _ => println("???")
избыточно, я думаю, что вы добавили в качестве оператора отладки. Также ваш SomeRow
никогда не возвращается, ваш readMany
имеет тип Future[Unit]
,
Возвращаясь к вашей проблеме, если вы используете ее как небольшой фрагмент кода, вы можете подождать Future
для завершения (помните, что блокировка на будущее в "реальном" приложении настоятельно не рекомендуется):
import scala.concurrent.duration._
import scala.concurrent.Await
object Foo extends App {
def readMany: Future[Unit] = ???
Await.ready(readMany, 10 seconds)
}
Вызов Await.ready ждет, пока будущее не станет завершенным, но не извлекает его результат. Точно так же вызов этого метода не вызовет исключения, если будущее не удастся.
Ваш код выше не обрабатывает сбои будущего, future.map
только позволяет обрабатывать успешные результаты.
Если происходит сбой при запуске db.run(action.asTry)
будущее не удастся.
Для обработки неудачного будущего вы можете использовать различные методы, например:
future.recover
future.onFailure
future.onComplete
- ...