[Scala,Akka]:未来的onComplete不会在发件人之外执行

时间:2017-11-05 09:24:21

标签: promise akka future akka-http

我有一个路由类(发送者),一个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
   }
}

问题是虽然onCompleteTestRoute.scala内工作,但在移至TestHelper.scala时无效。任何想法可能是什么问题?

编辑:通过“它不起作用”,我的意思是整个onComplete函数被跳过并且根本没有执行 - 没有错误,只是跳过。

1 个答案:

答案 0 :(得分:0)

很少有"古怪"使用可能解释问题的代码。

1.鉴于futureResponse类型为Future[Any],您的代码甚至会编译,我感到很惊讶。 You should use mapToAny转换为已知类型T。您现在构建代码的方式意味着Any有一个Marshaller,可以在TestRoute中使用,但不能在TestHelper中使用。

2. responseval而不是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
  }