2015-08-28 45 views
0

我們要使用Play框架simulata另一個應用程序。要求是延遲響應例如5秒。如何使用Promise.timeout在遊戲框架過濾

我想要做一個過濾器,因爲這將適用於所有的行動。我想在返回操作後使用play.api.libs.concurrent.Promise.timeout延遲響應。我是Scala的新手,我真的不知道如何用Scala編寫代碼,我總是得到一個Future[Future[Result]]的對象。

有人能告訴我,我應該用哪一種方法,以及如何?

編輯

我的不正確的代碼與編譯錯誤

nextFilter(requestHeader).map {result=> 
    play.api.libs.concurrent.Promise.timeout(result, 5.seconds) 
} 
+0

您可以添加過濾器的代碼? –

+0

@PeterNeyens,謝謝!我還沒有可行的代碼,我將添加我的不正確的代碼與編譯錯誤。 – Xilang

回答

0

TL; DR可以使用flatMap而不是map

  • nextFilter是一個函數,它接受一個RequestHeader並返回 一個Future[Result](參見Filter.apply)。
  • Promise.timeout返回Future[A]

您結合,因爲在你的情況Promise.timeout返回一個Future[Result],你最終Future[Future[Result]]他們使用Future.map功能,這需要果然AB並返回一個Future[B],一個功能。

我們可以通過使用flatMap代替map解決這個問題。 Future.flatMap需要果然AFuture[B]一個功能,那正是Promise.timeout呢,所以你可以使用:

nextFilter(requestHeader).flatMap { result => 
    play.api.libs.concurrent.Promise.timeout(result, 5.seconds) 
}