2016-12-02 3 views
1

Я получаю следующее сообщение об ошибке компиляции в future recover линии:future.recover в Play для 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 ("Failed") '. Это не Java, вы не можете сделать 'return thisStuff else .. return that ...'. Последним объектом, который вы возвращаете из своего метода, является результат ... См. Ответ ниже. –

ответ

3

Если вы поближе к методу Future.recover вы увидите, что частичная функция должна иметь подтип типа будущегокиевстар, в вашем случае Int, потому что вы применяете восстановить в исходное «будущего» будущего. Чтобы исправить это, вы должны применить его к сопоставляются:

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

} 
Смежные вопросы