【发布时间】:2018-09-29 22:24:21
【问题描述】:
嗨,我正在研究 Scala Future,获取内部数据的方法在 Future/Promises 中被扭曲了。所以我写了所有我知道的模型,用于获取 Scala Futures 的内部数据。
我们总是看到这两种情况:
1- 有时我们会在 异步函数块中获得 未来的内部数据,例如 map、flatMap、foreach、fold ......
2- 有时我们会在 Future 中得到结果,例如使用 Await
在这个例子中,我使用 Akka ? 或 ask 函数(它是异步的)并且我尝试了解如何获得未来结果的最佳实践
1- 出块?
2-in 阻止?
- 我们知道当我们异步时阻塞是不好的做法(所以使用
Await、Sleep、...)是不好的。
请帮我找到最佳实践替换 Await 或 Future.value.get.get
Tnx !!!
这是我的代码示例:
//Main Problem
val futureResult: Future[String] = (ping ? AskingTest).mapTo[String]
//Solution number 1
val awaitResult = Await.result(futureResult, myTimeout)
println(s"(1): $awaitResult")
//Solution number 2
val eitherResult: Either[Throwable, String] = Await.ready(futureResult, myTimeout).value.get match {
case Success(str) => println(s"(2): $str");Right(str)
case Failure(err) => println(s"(2): $err");Left(err)
}
//Solution number 3 ***low speed***
import scala.concurrent.ExecutionContext.Implicits.global
//BadPractice: Writ in play documentation.
futureResult map { x: String =>
println(s"(3): $x")
}
//Solution number 4
futureResult.value.get match {
case Success(str) => println(s"(4): $str")
case Failure(err) => println(s"(4)$err")
}
//Solution number 5
futureResult onComplete {
case Success(str) => println(s"(5): $str")
case Failure(err) => println(s"(5): $err")
}
【问题讨论】:
标签: scala async-await future