我有一个路由类(发送者),一个actor和一个帮助器类。在routes类中,我向actor发送请求并获得Future响应。现在,我想将未来的响应传递给帮助程序并在那里解决它。
TestRoute.scala:
val response: Future[Any] = (actor ? request) (timeout)
handler(response)(executionContext)
TestHelper.scala:
def handler(futureResponse: Future[Any])(implicit ec: ExecutionContext): StandardRoute = {
onComplete(futureResponse) {
case Success(s) => complete(s)
case Failure(f) => reject
}
}
问题是虽然onComplete
在TestRoute.scala
内工作,但在移至TestHelper.scala
时无效。任何想法可能是什么问题?
编辑:通过“它不起作用”,我的意思是整个onComplete函数被跳过并且根本没有执行 - 没有错误,只是跳过。
答案 0 :(得分:0)
很少有"古怪"使用可能解释问题的代码。
1.鉴于futureResponse
类型为Future[Any]
,您的代码甚至会编译,我感到很惊讶。 You should use mapTo
将Any
转换为已知类型T
。您现在构建代码的方式意味着Any
有一个Marshaller,可以在TestRoute
中使用,但不能在TestHelper
中使用。
2. response
是val
而不是def
的事实意味着Actor
只会被查询一次,而不是每次请求一次。我想你想要的东西:
type Output = ???
val response: () => Future[Output] =
() => (actor ? request) (timeout) andThen (_.mapTo[Output])
哪会改变处理程序的签名:
def handler(futureResponse: () => Future[Output])(implicit ec: ExecutionContext): StandardRoute =
onComplete(futureResponse()) {
case Success(s) => complete(s)
case Failure(f) => reject
}