未来不适用于Slick 3.1.x.

时间:2017-03-28 09:59:41

标签: scala slick slick-3.0

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 个答案:

答案 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
  • ...