1

我正在尝试将 ActorRef 传递给调用客户端。这是一些代码:

object Sub {
  implicit val timeout = Timeout(5 seconds)
  lazy val default = {
    val subActor = Akka.system.actorOf(Props[Sub], "sub")
    subActor
  }

  def apply(pChannel: Concurrent.Channel[JsValue]):ActorRef = {
    (default ? Register(callback)).map {
      case ref:ActorRef => ref
    } 
  }
}

调用它的客户端只是调用val sub:ActorRef = Sub(channel)

然而,我遇到的问题是:

[error]  found   : scala.concurrent.Future[akka.actor.ActorRef]
[error]  required: akka.actor.ActorRef

如何修改上面的代码以获取调用代码的 ActorRef 以获得它需要的 ref?

4

1 回答 1

2

Future是在以后的某个时间的某个价值的承诺。在这种情况下Future[ActorRef],是一个表示现在或将来某个时间点的 ActorRef 的值。

您真的不想直接获取 ActorRef,您可能希望将调用代码与返回的未来组合起来。

例如,如果您的代码执行以下操作:

val sub = Sub(channel)
doSomething(sub)

您想将其重写为:

Sub(channel).map { sub =>
  doSomething(sub)
}

doSomething(sub)因为这将创建一个新的未来,该未来会在sub值可用时自动调用。您还可以将示例重写为:

for(sub <- Sub(channel)) yield doSomething(sub)

如果您希望阻止调用代码并在可用时返回值(这通常违反 Akka、Play 和响应式编程的设计原则),您始终可以使用Await,例如:

// Await.result() takes a Future[T] and returns a T
val sub = Await.result(Sub(channel), 10 seconds)

但在库代码中这样做是糟糕的设计,不推荐。您应该只在处理结束时等待期货,即使那样,框架通常也会为您处理。

于 2013-10-16T19:26:34.733 回答