当我在Scala.js中使用期货时,至少在测试中,它们永远不会被执行,我无法等待它们。
考虑到这个简单的测试:
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
当我做一个讨厌的黑客而不是Await
这样的时候:
while(!future.isCompleted) {}
它永远运行。
是否等待scala.js不起作用?是否无法在测试中使用期货和Await
他们的结果?
编辑:它适用于scala.scalajs.concurrent.JSExecutionContext.Implicits.runNow
而不是queue
,但这会以同步的方式调用期货。