【问题标题】:Future not working in Slick 3.1.x未来在 Slick 3.1.x 中不起作用
【发布时间】:2017-03-28 18:47:48
【问题描述】:

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("???")
      }
   }

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

    首先case _ => println("???") 是多余的,我猜你是作为调试语句添加的。此外,您的 SomeRow 永远不会返回,您的 readMany 的类型为 Future[Unit]

    回到您的问题,如果您将其作为小代码 sn-p 运行,您可能需要等待您的 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失败,调用该方法也不会抛出异常。

    【讨论】:

      【解决方案2】:

      您上面的代码不处理未来的失败,future.map 只允许处理成功的结果。

      如果运行db.run(action.asTry)时出现crash,future会失败。

      为了处理失败的未来,你可以使用各种方法,例如:

      • future.recover
      • future.onFailure
      • future.onComplete
      • ...

      【讨论】:

      • 我在future.map 之后附加了.recover { case e => println(e) } 仍然得到相同的结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多