如何在播放框架过滤器中使用 Promise.timeout

How to use Promise.timeout in play framework filter

我们想使用Play框架来模拟另一个应用程序。要求是延迟响应,例如 5 秒。

我想在过滤器中执行此操作,因为它将应用于所有操作。我想使用 play.api.libs.concurrent.Promise.timeout 在操作 returns 之后延迟响应。我是 Scala 的新手,我真的不知道如何用 Scala 编码,我总是得到一个 Future[Future[Result]] 对象。

谁能告诉我应该使用哪种方法以及如何使用?

已编辑

我的代码有编译错误

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

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

  • nextFilter 是一个接受 RequestHeader 和 returns 的函数 Future[Result](参见 Filter.apply)。
  • Promise.timeout returns一个Future[A].

您使用 Future.map 函数组合它们,该函数接受一个将 A 变成 B 和 returns 变成 Future[B] 的函数,因为在您的case Promise.timeout returns a Future[Result],你最终得到 Future[Future[Result]].

我们可以使用 flatMap 而不是 map 来解决这个问题。 Future.flatMap 接受一个将 A 变成 Future[B] 的函数,这正是 Promise.timeout 所做的,所以你可以使用 :

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