Scala 检查已完成承诺价值的正确方法?

Scala 检查已完成承诺价值的正确方法?,scala,concurrency,promise,Scala,Concurrency,Promise,上下文:我有一个函数,我想在开始时检查某个承诺a)已经完成,b)有某个值 有一种方法可以检查Scala中的承诺(从2.11.5开始)是否已经完成,即isCompleted。但是,当您想要获得已完成承诺的值时,您必须编写一个如下的无吸引力链: val p = Promise[Boolean] val result = p.future.value.get.toOption.get (为了完整性:我在考虑写一些东西,比如: if (p.isCompleted && p.future

上下文:我有一个函数,我想在开始时检查某个承诺a)已经完成,b)有某个值

有一种方法可以检查Scala中的承诺(从2.11.5开始)是否已经完成,即
isCompleted
。但是,当您想要获得已完成承诺的值时,您必须编写一个如下的无吸引力链:

val p = Promise[Boolean]
val result = p.future.value.get.toOption.get
(为了完整性:我在考虑写一些东西,比如:

if (p.isCompleted && p.future.value.get.toOption.get == true)
但对这段代码的丑陋感到震惊:)


没有更好的办法了吗?或者这是我没有按照预期的方式使用它的一种迹象?

我想说你没有按照预期的方式使用它

首先,Scala承诺主要是一种“引导”未来的机制,因此您传递的价值通常应该是未来,而不是承诺。这使得一个段的访问链更短

接下来,您之所以要经历这么多层,是因为Futures封装了两种效果—并发和失败。未来可能会完成,也可能会失败,所以检查
isCompleted
只是故事的一半

所以你可以在这里使用模式匹配。Some/None模式匹配检查completed/notcompleted,因此不需要显式检查
.isCompleted
属性。在这里,我假设您有一个未来
f
而不是一个承诺,但是如果需要,您可以对
p.Future
做同样的事情):

在您的具体案例中,这可以归结为Sarvesh在其回答中所展示的内容,尽管我认为您很有可能实际上应该处理错误,而不是完成案例,而不仅仅是将它们视为
false


使用期货的另一种方式是以事件驱动的方式使用期货。您可以在
f.和
f.onFailure
f.onSuccess
上注册事件,具体取决于您希望观察的结果,并且您可以使用各种其他机制来转换其结果等等。

。。。基本上,承诺是一种包装物,它允许我们与潜在的未来互动

所以。。。从完成的承诺中获得未来,并使用模式匹配

在这种情况下,p.future.value将是一个
选项[Try[Boolean]]

val yourBool = p.future.value match {
  case Some( Success( bool ) ) => bool
  case _ => false
}

Future[T].value
返回一个
选项[Try[T]
,如果Future尚未完成,则该选项为none,因此您不需要同时选中
isCompleted
。这意味着您可以将该方法编写为:

def hasValue[T](p: Promise[T], value: T) = p.future.value.flatMap(_.toOption) == Some(value)

不管是谁,如果你想否决投票,请发表评论。这有助于我了解答案中的错误。
def hasValue[T](p: Promise[T], value: T) = p.future.value.flatMap(_.toOption) == Some(value)