scala – 如何在akka中使用“ask”获取三个值

前端之家收集整理的这篇文章主要介绍了scala – 如何在akka中使用“ask”获取三个值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个演员向三个演员发送消息,并等待所有三个演员的回应才能继续.
actor返回表单的数据类型:List [(String,Double,String)].
我希望它们都根据Tuple3的Double值进行排序.

到目前为止,我编写的代码是:

implicit val timeout = Timeout(5.seconds)
  val x = actorOne ? "hey"
  val y = actorTwo ? "you"
  val z = actorThree ? "there"
  val answer = for{
    a <- x.mapTo[List[(String,String)]]
    b <- y.mapTo[List[(String,String)]]
    c <- z.mapTo[List[(String,String)]]
  } yield a ++ a ++ a sortBy(_._2)

我如何确保演员不会继续进行,直到所有三个演员都做出回应?

谢谢

解决方法

只有在对a,b和c进行评估后才能评估您的理解能力,因此您无需在那里做任何事情.如果你的意思是你有一些后来依赖于答案的价值,那么你可以把它放在onComplete中:

answer.onComplete {
  case Success(x) => // do something on success
  case Failure(ex) => // report failure
}

您可以使用Promise在合适的时间与结果进行交互.例如.如果你的外部方法应该返回Future [Boolean],你可以这样做:

def myFunction():Future[Boolean] = {
  val p = Promise[Boolean]
  implicit val timeout = Timeout(5.seconds)
  val x = actorOne ? "hey"
  val y = actorTwo ? "you"
  val z = actorThree ? "there"
  val answer = for{
    a <- x.mapTo[List[(String,String)]]
  } yield a ++ a ++ a sortBy(_._2)
  answer.onComplete {
    case Success(x) => 
       // do something with x
      p.success(true)
    case Failure(ex) =>
       // process faliure
      p.success(false)
  }
  p.future
}

猜你在找的Scala相关文章