gpt4 book ai didi

scala - 无法在 scala.js 中使用 futures - Rhino 无法加载 Scala.js 类

转载 作者:行者123 更新时间:2023-12-01 10:06:30 25 4
gpt4 key购买 nike

当我在 Scala.js 中使用 futures 时,至少在测试中,它们永远不会被执行,我不能等待它们。

给定这个简单的测试:

package example

import utest._
import utest.framework.{Test, TestSuite}
import utest.util.Tree

import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import scala.language.postfixOps
import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue

object SomeFutureTest extends TestSuite {
override def tests: Tree[Test] =
TestSuite {
'runs_future {
val eventualString: Future[String] = Future[String] {
"foo"
}
Await.result(eventualString, 5 seconds)
}
}
}

当我在 sbt 控制台上运行 test 时,我得到:

JavaException: org.scalajs.jsenv.rhino.ScalaJSCoreLib$ClassNotFoundException:
Rhino was unable to load Scala.js class: ju_concurrent_locks_AbstractQueuedSynchronizer

当我做一个讨厌的 hack 而不是像这样 Await 时:

while(!future.isCompleted) {}

它永远运行。

Await 在 scala.js 中不起作用吗?难道不能在测试中使用 Futures 和 Await 它们的结果吗?

编辑:它使用 scala.scalajs.concurrent.JSExecutionContext.Implicits.runNow 而不是 queue,但这会以同步方式调用 futures。

最佳答案

确实,Await 在 Scala.js 中不起作用。它不能,因为它是一个阻塞 API,并且在 JS 环境中没有阻塞这样的东西。

出于这个原因,测试框架以一种特殊的方式支持Future,允许测试本身返回其执行的Future .然后,测试框架负责一直保持异步,直到最终显示单元测试的结果。

作为documented in its Readme , uTest 支持这个。在您的情况下,这将提供:

TestSuite {
'runs_future {
val eventualString: Future[String] = Future[String] {
"foo"
}
for (theString <- eventualString) yield {
assert(theString == "foo")
// and/or:
theString
}
}
}

如果您更习惯于 map 表示法,那么这里是等效的:

TestSuite {
'runs_future {
val eventualString: Future[String] = Future[String] {
"foo"
}
eventualString map { theString =>
assert(theString == "foo")
// and/or:
theString
}
}
}

关于scala - 无法在 scala.js 中使用 futures - Rhino 无法加载 Scala.js 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29951327/

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