【问题标题】:Cannot use futures in scala.js - Rhino was unable to load Scala.js class无法在 scala.js 中使用期货 - Rhino 无法加载 Scala.js 类
【发布时间】: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,但这会以同步方式调用期货。

【问题讨论】:

    标签: scala scala.js


    【解决方案1】:

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

    因此,测试框架以一种特殊的方式支持Futures,允许测试 本身返回其执行的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
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 2020-05-04
      • 2018-02-05
      • 1970-01-01
      • 2015-02-10
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多