我们想使用Play框架来模拟另一个应用程序。要求是延迟响应,例如5秒。
我想在过滤器中执行此操作,因为它将适用于所有操作。我希望在操作返回后使用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)
TL; DR 您可以使用flatMap
代替map
。
nextFilter
是一个接受RequestHeader
并返回的函数
Future[Result]
{(Filter.apply
)。Promise.timeout
会返回Future[A]
。您使用Future.map
函数合并它们,该函数将A
转换为B
并返回Future[B]
,因为在您的情况下Promise.timeout
返回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)
}