2016-12-02 55 views
1

我得到下面的编译错误在future recover行:future.recover在玩Scala没有编译

类型不匹配;发现:scala.concurrent.Future [任何]要求: 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") 
      } 
     } 

    } 
} 
+0

不,你不是! :D您正在返回值'2'或'Ok(“失败”)'。这不是Java,你不能'返回thisStuff否则..返回那个...'。您从方法中返回的最后一个对象是结果...请参阅下面的答案。 –

回答

3

如果在Future.recover方法需要仔细看你会发现部分功能应该有前途的类型的子类型,你的情况诠释,因为你申请恢复原来的未来“未来”。为了解决这个问题,你应该把它应用到映射:

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

您忘记链,所以不喜欢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") 
    }} 

}