当在演员内部调用时,是否可以从 returns 一个值的方法中获取值?

Is it possible to get the value from a method that returns a value, when called inside an actor?

我有这样定义的演员

class RandomActor @Inject() (
                             accounts: models.Accounts
                             )extends Actor with ActorLogging{
  override def receive: Receive = {
    case Create(address, username, type, password) => {
      accounts.Service.create(address, username, type, password)
    }
  }
}

Accounts 是一个模型 class,带有一个名为 Serviceobject,它具有 create 方法。 此 create 方法 return 是 Future[String]。因此,当我尝试从演员调用此创建方法时,是否可以将来自演员的 return Future[String] 作为消息存储到演员外部的变量中?

这里似乎有两个问题:如何从 Future 生成消息以及如何从 actor 系统“输出”消息。

第一个问题的答案是在Future上使用onComplete:

 accounts.Service.create(address, username, type, password).onComplete{
   case Success(account) =>
     otherActor ! AccountCreated(account)
   case Failure(e) =>
     otherActor ! CreateAccountFailed(address, username, type)
 }

这将在 Future 完成(成功或出错)时发送适当的消息。

第二个问题的答案是使用 ask 模式,允许从演员系统外部向演员发送消息并收到回复:

(RandomActor ? RequestMessage).mapTo[ReplyType].onComplete {
  case Success(reply) =>
    // process reply
  case Failure(e) =>
    // process error
}

请注意,答案将异步出现在单独的线程中,因此在处理此类回复时需要小心。有关询问的更多详细信息,请参阅 here