如何在 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]
我想简化我的 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]