【问题标题】:future.recover in Play for Scala does not compilePlay for Scala 中的 future.recover 无法编译
【发布时间】:2016-12-02 02:40:36
【问题描述】:

我在future recover 行中收到以下编译错误:

类型不匹配;发现:需要 scala.concurrent.Future[Any]: scala.concurrent.Future[play.api.mvc.Result]

我返回 Ok() 这是一个 Result 对象,那么为什么编译器会抱怨?

class Test2 extends Controller  {

  def test2 = Action.async { request =>

          val future = Future { 2 }

          println(1)

          future.map { result => {
             println(2)
             Ok("Finished OK")
           }
          }

         future.recover { case _ => {    // <-- this line throws an error
               println(3)
               Ok("Failed")
           }
         }

    }
 }

【问题讨论】:

  • 不,你不是! :D 您正在返回值 2Ok("Failed")。这不是 Java,你不能这样做 return thisStuff else .. return that... 。您从方法返回的最后一个对象是结果...请参阅下面的答案。

标签: scala playframework playframework-2.5


【解决方案1】:

如果您仔细查看 Future.recover 方法,您会发现部分函数应该具有未来类型的子类型,在您的情况下为 Int,因为您将恢复应用于原始未来“未来”。要修复它,您应该将其应用于映射:

future.map {
  result => {
    println(2)
    Ok("Finished OK")
  }
}.recover { 
  case _ => {    
    println(3)
    Ok("Failed")
  }
}

【讨论】:

    【解决方案2】:

    你忘记了链接,所以像 Nyavro 写的那样做,或者,如果你喜欢另一种风格,那么只需引入一个中间变量。

    def test2 = Action.async { request =>
    
      val future = Future { 2 }
    
      println(1)
    
      val futureResult = future.map { result => {
        println(2) 
        Ok("Finished OK")
      }}
    
      futureResult.recover { case _ => {    
        println(3)
        Ok("Failed")
      }}
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 2017-06-17
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      相关资源
      最近更新 更多