Scala 演员询问电话的顺序

Scala 演员询问电话的顺序,scala,akka,Scala,Akka,假设我有以下演员: class A extends Actor { def receive = { case Unlock => sender ! UnlockResponse (Boolean_code) case Read => sender ! ReadResponse (somedata) case Lock => sender ! LockResponse (Boolean_code) } } 我想写一个help

假设我有以下演员:

class  A extends Actor {
  def receive = {
      case Unlock => sender ! UnlockResponse (Boolean_code)
      case Read => sender   ! ReadResponse (somedata)
      case Lock => sender ! LockResponse (Boolean_code)
    } }
我想写一个helper方法,在这个方法中,我可以依次调用unlock、read和lock,并在最后一步(lock)完成后将ReadResponse中的“somedata”返回给方法调用方


我喜欢for comprehension方法,但我如何更灵活地编写它,例如,如果Unlock在第一步返回UnlockResponse(true),则继续只读,但如果返回UnlockResponse(false),则中止?对于可以使用api的顺序逻辑,请:

然后根据结果,你可以做类似的事情

p.future.onComplete {
  case Success(somedata) => {
      processData(somedata)
      anActorRef ! Lock
  }
  case Failure(t) => logger.error(t)
}

可以通过参与者Been/unbecome和实现具有相同顺序效果的更优雅的解决方案,其中事务逻辑由参与者本身而不是发送者处理。

对于顺序逻辑,您可以使用api:

然后根据结果,你可以做类似的事情

p.future.onComplete {
  case Success(somedata) => {
      processData(somedata)
      anActorRef ! Lock
  }
  case Failure(t) => logger.error(t)
}

通过参与者been/unbecome,可以获得具有相同顺序效果的更优雅的解决方案,其中事务逻辑由参与者本身而不是发送者处理。

正如我在评论中所述,只需使用A来理解,其中包含一个保护条件,如下所示:

val result = 
  for{
    unlockResult <- (nActorRef ? Unlock).mapTo[UnlockResponse]
    if unlockResult.result == true
    readResult <- (anActorRef ? Read).mapTo[ReadResponse]
  } yield readResult

正如我在评论中所说的,只需使用a进行理解,其中包含一个保护条件,如下所示:

val result = 
  for{
    unlockResult <- (nActorRef ? Unlock).mapTo[UnlockResponse]
    if unlockResult.result == true
    readResult <- (anActorRef ? Read).mapTo[ReadResponse]
  } yield readResult

您是否只是尝试使用参与者实现类似于<代码>信号灯的功能?您是否尝试在for comprehension中添加保护条件以检查解锁请求的值?您是否只是尝试使用参与者实现类似于<代码>信号灯的功能?您是否尝试将保护条件添加到for comprehension中以检查解锁请求的值检查解锁请求的值?谢谢。这看起来不错,但是当我在Read()之前的序列中添加一个额外的actor调用时,我很难将其正确。我可以用两个期货的结果依次完成一个承诺,还是我需要两个承诺?这是不正确的。无论解锁的结果如何,您都可以在此处触发读取,因为ask操作不在应用于
解锁的
映射
操作的范围内。如果您确实只想在解锁成功时触发读取,则需要在解锁结果为真的情况下将ask操作向下移动到
映射中。谢谢。这看起来不错,但是当我在Read()之前的序列中添加一个额外的actor调用时,我很难将其正确。我可以用两个期货的结果依次完成一个承诺,还是我需要两个承诺?这是不正确的。无论解锁的结果如何,您都可以在此处触发读取,因为ask操作不在应用于
解锁的
映射
操作的范围内。如果您确实只想在解锁成功时触发读取,则需要在解锁结果为真的情况下将ask操作向下移动到
映射中。谢谢。这种方法看起来更干净,我可以使用防护装置轻松控制过程。谢谢。这种方法看起来更干净,而且我能够使用防护装置轻松地控制过程。