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("???")
}
}
答案 0 :(得分: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会等到将来完成,但不会检索其结果。同样,如果未来失败,调用该方法不会抛出异常。
答案 1 :(得分:1)
上面的代码不能处理未来的失败,future.map
只允许处理成功的结果。
如果在运行db.run(action.asTry)
时发生崩溃,将来会失败。
要处理失败的未来,您可以使用各种方法,例如:
future.recover
future.onFailure
future.onComplete