【发布时间】:2015-04-29 18:10:40
【问题描述】:
当我在 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
当我做一个讨厌的 hack 而不是 Await 像这样:
while(!future.isCompleted) {}
它永远运行。
Await 在 scala.js 中不起作用吗?难道不能在测试中使用Futures和Await他们的结果吗?
编辑:它适用于scala.scalajs.concurrent.JSExecutionContext.Implicits.runNow 而不是queue,但这会以同步方式调用期货。
【问题讨论】: