【问题标题】:Scala futures and Await.result()Scala 期货和 Await.result()
【发布时间】:2017-10-18 01:14:33
【问题描述】:

我希望下面的代码会导致 syncResult 包含“字符串二”,但相反,我收到了错误 java.lang.NoClassDefFoundError: Could not initialize class

import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

def randomFunction1(): Future[String] = {
    Future.successful("string one")
}

def randomFunction2(): Future[String] = {
    Future.successful("string two")
}

val asyncResult: Future[String] = for {
    r1 <- randomFunction1()
    r2 <- randomFunction2()
} yield r2

val syncResult: String = Await.result(
    asyncResult,
    1.second
)

我得到以下类似的结果。

import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

def randomFunction1(): Future[String] = {
    Future.successful("string one")
}

def randomFunction2(): Future[String] = {
    Future.successful("string two")
}

val asyncResult: Future[String] = randomFunction1().flatMap(
    r1 => {
        randomFunction2()
    }
)

val syncResult: String = Await.result(
    asyncResult,
    1.second
)

我正在使用 Scala 2.12.2 解释器通过 :paste 运行它。

我的代码有什么问题?

【问题讨论】:

  • 您的 Await() 由于 REPL 环境而超时。从文件或 IntelliJ 工作表中编译时,它可以正常运行。
  • @jwvh 对我来说,这两个示例在 REPL 中都按预期工作。大卫你能发布完整的异常,即调用堆栈吗?
  • 如果您将Await.result 块替换为asyncResult onComplete { case Success(a) =&gt; print(a) case Failure(err) =&gt; print("failed") },那么它应该可以工作。 Await.result 似乎有问题
  • 我认为这是与stackoverflow.com/q/45839567/5684257 相同的潜在问题。超过了超时时间(出于某种普通原因,可能是 REPL 的包袱让事情变慢了),导致Await.result 以某种黑暗魔法的方式抛出异常,从而破坏了其他一些 REPL 机制。编辑:是的,NoClassDefFoundError 是由 &lt;clinit&gt; 中的 TimeoutException 引起的。

标签: scala future


【解决方案1】:

这似乎是 Scala REPL 的问题。

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 2013-04-27
    • 2015-07-22
    • 2021-03-02
    • 1970-01-01
    • 2015-04-19
    • 2017-11-18
    • 2015-07-09
    • 2013-12-16
    相关资源
    最近更新 更多