gpt4 book ai didi

scala - 检查已完成 Promise 的值的正确方法?

转载 作者:行者123 更新时间:2023-12-02 08:55:00 25 4
gpt4 key购买 nike

上下文:我有一个函数,我想在开始时检查某个 Promise 是否 a) 已经完成并且 b) 具有一定的值。

Scala 中有一个方法可以检查 Promise 是否已经完成(从 2.11.5 开始),即 isCompleted。然而,当你想获取已经完成的 Promise 的值时,看起来你必须写一个像这样的令人倒胃口的链:

val p = Promise[Boolean]
val result = p.future.value.get.toOption.get

(为了完整性:我正在考虑写一些类似的东西:

if (p.isCompleted && p.future.value.get.toOption.get == true)

但对该代码的丑陋感到震惊:) )

有没有更好的办法?或者这是否表明我没有按照预期的方式使用它?

最佳答案

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

首先,Scala Promises 主要是一种“引导”Futures 的机制,因此您传递的值通常应该是 Futures 而不是 Promise。这使得访问链缩短了一段。

接下来,您要经历这么多层的原因是 Futures 封装了两种效果 - 并发和失败。 Future 可以完成也可以失败,因此检查 isCompleted 只是故事的一半。

所以你在这里可以做的是使用模式匹配。 Some/None 模式匹配检查已完成/未完成,因此您无需对 .isCompleted 属性进行显式检查。在这里,我假设您有一个 Future f 而不是 Promise,但如果需要,您可以对 p.future 执行相同的操作):

f.value match {
case Some(Success(v)) => // completed successfully - access value v
case Some(Failure(e)) => // completed with failure - access error e
case None => // not yet complete
}

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

使用 Future 的另一种方法是以事件驱动的方式使用它们。您可以根据您想要观察的结果在 f.andThenf.onFailuref.onSuccess 上注册事件,并且可以使用使用各种其他机制来转换其结果等等。

关于scala - 检查已完成 Promise 的值的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29062926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com