如何在 Akka/Futures 中简化未来的结果处理?

How to simplify future result handling in Akka/Futures?

我想简化我的 for comprehension 代码,使其尽可能简单。

这是代码

case object Message

class SimpleActor extends Actor {
  def receive = {
    case Message => sender ! Future { "Hello" }
  }
}

object SimpleActor extends App {

  val test = ActorSystem("Test")
  val sa = test.actorOf(Props[SimpleActor])

  implicit val timeout = Timeout(2.seconds)

  val fRes = for {
    f <- (sa ? Message).asInstanceOf[Future[Future[String]]]
    r <- f
  } yield r

  println {
    Await.result(fRes, 5.seconds)
  }

}

是否可以去掉这部分

.asInstanceOf[Future[Future[String]]]

?

查看 pipeTo 函数,它是关于在 Actors 之间传递 Future 的。请参阅 here 询问模式。

myFuture pipeTo sender

在你的情况下,你的 return 类型将是 Future[String],正如你在下面的评论中所要求的那样,需要 mapTo[String] 才能使结果类型成为 String。因此你的 for-comp 可以被抛弃并直接调用:

 val fRes = (sa ? Message).mapTo[String]