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操作向下移动到映射中。谢谢。这种方法看起来更干净,我可以使用防护装置轻松控制过程。谢谢。这种方法看起来更干净,而且我能够使用防护装置轻松地控制过程。