如何从 akka future onComplete 回调的成功和失败块中获取值

how to get values from akka future onComplete callbacks 's Success and Failures blocks

我有一个代码,我在其中检查演员是否已经不存在我们将创建它但问题是我的代码正在使用未来的 OnComplete 回调,我正在 function/def 中执行此操作并且我只想 return 这里的 ActorRef 是我的代码

def getRegularAdminIndexMongoActor():ActorRef= {
        var actorRef:ActorRef=null
    val sel = actorSystem.actorSelection("akka://ActorSystem/user/RegularAdminIndexMongoActor");
     val future:Future[ActorRef] = sel.resolveOne().mapTo[ActorRef] 
     future.onComplete { 
          case Success(result)=>  
          if(result != null){
            log.info("actor exists" + result)
          }
          actorRef=result
          actorRef
         case Failure(e)=>
           log.warn("in failure block actor does not exists" + e)
           val regularAdminIndexMongoActor=system.actorOf(Props[RegularAdminIndexMongoActor],name = "RegularAdminIndexMongoActor")
           log.info("created a new one "+regularAdminIndexMongoActor.path.toString())
           actorRef=regularAdminIndexMongoActor      
     }
log.info("whats is in actorRef " + actorRef)
     actorRef
         }

我这样调用代码

log.info("getting ref"+getRegularAdminIndexMongoActor)

and the output is 
15:33:39.082 555049 [play-internal-execution-context-1] Global$ INFO - whats in actorRef null
15:33:39.082 555049 [play-internal-execution-context-1] Global$ INFO - getting ref null
15:33:39.083 555050 [play-internal-execution-context-1] play INFO - Application started (Dev)
15:33:39.151 555118 [ForkJoinPool-4-worker-7] Global$ INFO - actor exists Actor[akka://ActorSystem/user/RegularAdminIndexMongoActor#-1022921773]

我怎样才能得到实际的 ActorRef,它给我 null 但 actor 正在创建,我试图通过这样做将 ref 存储在两个块中

actorRef=result //success block
actorRef=regularAdminIndexMongoActor //failure block

我认为它在调用 onComplete 之前 returning 值和 returning null 因为我在我的函数的开头初始化了变量 null 我该如何解决这个问题?请帮助我如何实现我想要的 ActorRef

actorRef 是一个 var,它会在 sel.resolveOne() 完成之前分配,这可能是在您返回值之前。如果你真的想以那种方式做你正在做的事情,你可以使用

import scala.concurrent._
import scala.concurrent.duration._

Await.result(f,Duration(6000,"millis"))

等待结果将阻塞,直到未来交付或 6 秒过去。

现在,就像其他人所说的那样,这不是一个好主意。

因为您似乎正在创建那个演员,所以您可以直接访问 children

val child = child(name)
child.getOrElse(getContext().actorOf(..., name))