首先让我解释一下我的问题。我有一个存储库,存储所有已知的ID。这个存储库是一个演员,让他叫他repo
。我在此actor中定义了GetId(id: Id)
消息和GetIdReply(Option[Id])
,以便请求特定的id并获得回复(如果它已经存在或没有)。我很直接地说。
现在我有另一个负责生成唯一ID的actor。所以我尝试实现这个功能,如:
private def getUniqueId(): Id = {
implicit val timeout = Timeout(500.millis)
var id = Id(UUID.randomUUID().toString)
val getIdReply = repo ? GetId(Id)
getIdReply.mapTo[GetIdReply] onSuccess {
case success =>
success.id match {
case Some(matchedId) =>
// Generated ID already exists, let's call this function recursively
id = getUniqueId
case None =>
// Generated ID is OK
}
}
id
}
我尝试将其作为递归来实现,只有在首次尝试时生成的ID是唯一的时候,此功能才有效。在第二次和所有其他尝试中,它不起作用。 所以我的问题是如何正确构建这样一个函数,它将循环#34;直到ID真的很独特?
THX!
最佳
答案 0 :(得分:2)
因为您的结果取决于与演员的沟通,所以您的函数必须返回Future
:
private def getUniqueId(): Future[Id] = {
implicit val timeout = Timeout(500.millis)
val id = Id(UUID.randomUUID().toString)
repo ? GetId(id) flatMap {
case GetIdReply(Some(_)) => getUniqueId()
case GetIdReply(None) => Future.successful(id)
}
}