如何在播放框架过滤器中使用 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)
}
我们想使用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)
}