【发布时间】:2022-02-01 17:29:33
【问题描述】:
我有点失败了这种奇怪的行为,不确定我到底错在哪里。所以情况是tester2 函数正在返回一个 Future[Boolean]] 现在我想等待它完成,当它完成时我希望它根据reset 函数内部的不同情况返回一个 List[String] ,现在的问题是返回 List[String] 而不是返回 Future[List[String]] ,无法理解为什么匹配函数会这样
确切地说,我得到了这个错误
val les = Await.ready(tester2(5),Duration.Inf).map(reset).forEach(println)
object HelloWorld {
def main(args: Array[String]) {
val exp = tester2(5).map(reset)
val les = Await.ready(tester2(5),Duration.Inf).map(reset).forEach(println)
println(s"what do you say ${les}")
}
def reset (x: Option[Boolean]): List[String] =
x match {
case None => List("abc","def")
case Some(false) => List("abc","def")
case Some(true) => List("def","abc")
}
def tester():Future[Option[Message]]={
Future{
Thread.sleep(5000)
Option(Message("abc","def","ghi"))
}
}
def tester2(param:Int):Future[Option[Boolean]]={
Future{
Thread.sleep(5000)
if(param>10){
Some(true)
}else{
Some(false)
}
}
}
【问题讨论】:
-
您没有正确输入错误。那是一行代码,可能是复制粘贴错误?
-
你永远不会想要
Await和Future,这基本上破坏了首先使用Future的整个想法。您想将其转换为另一个Future并在整个链中一直返回它,直到 main 或其他东西。 -
@LuisMiguelMejíaSuárez 我完全理解你的意思,但这只是对我试图理解的真实代码的模仿
-
@LuisMiguelMejíaSuárez 我认为向他们不能使用
Await .result的人解释没有帮助。全世界每个使用 Future 的 Scala 程序都至少有 1 个 await 语句……否则它永远不会产生任何输出。它对于在孤立的代码片段中掌握和研究期货特别有用。在他们意识到Await.result的潜在死锁影响并开始专注于删除它的所有实例之后。然而,教授Await.result是理解 Futures 的核心,而你会因为忽略它而迷惑人们。Option.get也是如此 -
@Philluminati “Await.result 是理解 Futures 的核心” 不,它不是,它只是一个快速的技巧,你可以在简短的例子中使用,或者在你不想要的时候使用实际使用
Futures,但您依赖于第三方库。 - “他同样适用于 Option.get”Option.get不应该真的存在,它没有一个有效的用例。 - “全世界每个使用 Future 的 Scala 程序都至少有 1 个 await 语句” 我怀疑,大多数使用Future的 Scala 程序都将使用框架接受Future作为最终结果,并且会完成这项肮脏的工作。
标签: scala asynchronous async-await future options