2017-12-01 13 views
0

次のコードでは、futureyieldを含むPlay for Scala機能があります。コンパイルエラーtype mismatch; found : scala.concurrent.Future[Nothing] required: play.api.mvc.Resultが表示されます。 Okの返信を返すために、私はフラットではないでしょうか?Scala用Playの将来の返品返品

def f1 = Future { 1 } 
    def f2 = Future { 2 } 

    def index = Action.async (parse.json) { request => 

     for { x1 <- f1 } 
     yield { 
      val f = f2 
      f.flatMap { result => 
       Ok("X") 
      } 

     } 
    } 
+0

'Future'の' yield'に 'Future.flatMap'を使用すると... – cchantep

答えて

4

いいえ、あなたはflatMapを言うときあなたは結果が関数で返さことを言っているが、あなたの例では、それは、Resultを返すので、ちょうどmapを使用して動作しますが、などの超慣用的ではありませんFuture[T]、ありますあなたはFuture[Future[Result]]と羽目として、あなたはflattenに持っている:

(for { x1 <- f1 } yield { 
    val f = f2 
    f.map(result => 
     Ok("X") 
    ) 
}).flatten 

何より慣用的であることは、全体のことのために理解するために使用することです:

for { 
    x1 <- f1 
    x2 <- f2 
} yield { 
    Ok("X") 
} 
+0

問題は私が3つの未来(f1、f1a、f1b)を理解と結果で動かす必要があることです私は別の未来のf2を実行する必要があります(私はyieldセクションにあります)。だから私は将来収穫の中で終わる。これを行う別の方法はありますか? – ps0604

+0

収入の中でその将来を実行する必要があるのはなぜですか?私が誤解していない限り、それは収量の外で生きられるように聞こえる。 –

+0

'for'ブロックの中に' x1b < - f1b'を追加し、 'yield x1b'と書くだけです。 –