2017-03-16 4 views
0

ビューアクションページにApiResponseオブジェクトが必要な私のプレイアクションに問題がありますが、私は未来[ApiResponse]であり、 "unwrap"未来。この未来を私のビューページに渡すときの解決方法

def confirm(token: String) = Action async { request => 
    // loadTokenInfo returns Future[Option[SP]] 
    loadTokenInfo(token).map { maybeSP => 
     maybeSP match { 
     case Some(sp) => 
      val someConfig = SomeConfiguration(..) 
      // confirmSubscription returns Future[ApiResponse] 
      for { 
      apiResp <- apiService.confirmSubscription(sp.account, sp.website, sp.list, sp.listMember) 
      } yield Ok(views.html.subscription.confirm(ConfirmPageViewModel(someConfig, sp, apiResp))) 

     case _ => 
      Ok(views.html.errorpage.empty(PageNotFound("asdf"))) 
     } 
    } 
    } 

私はエラーを取得しています:

[error] found : scala.concurrent.Future[play.api.mvc.Result] [error] required: play.api.mvc.Result

を私もapiRespの上にマッピングすることを試みたが、それは動作しませんでした:

apiResp.map { r => 
    Ok(views.html.subscription.confirm(ConfirmPageViewModel(pageConfig, sp, r))) 
} 

私はAwait.resultを呼び出す必要がありますここに?私は明らかにブロックしたくないが、この時点で何をすべきかはわからない。

答えて

2

エラーが発生した場所と、confirmSubscriptionが返す場所を指定していないため、おそらく何かのFutureが推測されています。

しかし、私は、少なくともあなたは、デフォルトの場合には、これを返す必要があると言うことができます。

Future.successful(Ok(views.html.errorpage.empty(PageNotFound("asdf")))) 

と右の世界であること、すべての愛のため、Await.resultを使用しないでください。

いくつかのランダム、無関係なノート:

mapを使用して
  • getOrElseOption上のパターンマッチより慣用的です。
  • confirmSubscriptionがちょうどspインスタンスを取り、apiServiceはそれを使用する必要がどのように決定させる場合、それはいいだろう。
  • 私はむしろfor内包表記を使用するよりもFuture秒以上のマッピングを好む - あなたはすでに行ったように - 一つだけがあるとき。
+1

そして、 'loadTokenInfo'の後に' flatMap'を使うべきです。 – vdebergue

+0

'Future'ではなく' Option'を返すと思うので、それについてはあまりよく分かりませんが、これらの機能は、言うことは難しいです。 – Vidya

+0

confirmSubscriptionが – Blankman

関連する問題