如何使用默认值编写此Akka请求调用的更好版本?

时间:2014-04-02 20:37:28

标签: scala akka

我正在编写一种方法,可以ask'通过发送case class消息给定的演员,我希望它返回给定类型的Future

回复信息是:

sealed abstract class StatusResponse
case class OKMaster() extends StatusResponse
case class ERRORMaster(error: String) extends StatusResponse

我目前的工作如下:

def askActor(id: Long): Future[StatusResponse] = (actor ? Request(id)).map{
   case response: StatusResponse => response
   case _ => ERRORMaster("Actor didn't send a proper StatusResponse, this error was generated instead")
}

这有效,但我仍然想知道是否有更好的方法。这对我来说仍然感觉很脏,因为我想有多个不同类型的演员要问相同类型的StatusResponse,我不得不复制粘贴这段代码。还有另一种功能性方法吗?我的意思是,如果响应不是预期类型的​​话,有一个默认值吗?

PS:我正在使用Akka 2.10和Scala 2.10.3。

1 个答案:

答案 0 :(得分:0)

您可以轻松地将其封装起来:

val handleStatusResponse: Any => StatusResponse = {
  case response: StatusResponse => response
  case _ => ERRORMaster("Actor didn't send a proper StatusResponse, this error was generated instead")
}

def askActor(id: Long): Future[StatusResponse] = (actor ? Request(id)).map(handleStatusResponse)

def askOtherActor(id: Long): Future[StatusResponse] = (actor ? OtherRequest(id + 3)).map(handleStatusResponse)

当然,如果您的不同演员有不同的响应类型或者在成功案例中需要不同的行动,则需要进行一些更改。