Подтвердить что ты не робот

Фьючерсы в Scala.js

Я попытался использовать Promises и Futures в Scala.js. Обещание работает, как только дело доходит до фьючерсов, я получаю предупреждения и ошибки.

Try:

val p1 = Promise[Int]
val f1: Future[Int] = p1.future
val p2 = Promise[Int]
val f2: Future[Int] = p2.future

val res1 =  for {
   v1 <- f1
   v2 <- f2
} yield v1 + v2


val res2 = f1.flatMap(x => f2.map(y => x + y))



res1 onSuccess {
  case x: Int => g.console.log(x);

}

res2 onSuccess {
  case x: Int => g.console.log(x);

}

// callback in dom, using ScalaTags
// div(`class` := "btn  btn-default", `type` := "button", onclick := click(1, p1))
def click(i: Int, p: Promise[Int])(x: dom.MouseEvent): Unit = {
  g.console.log(i);
  try {
    p success i
  }
  catch {
    case x: Throwable => println("again")
  }
}

f1 onSuccess {
  case x: Int => 1

}

И я получаю в sbt fastOptJs:

[warn] Referring to non-existent class jl_Thread$UncaughtExceptionHandler
[warn]   called from s_concurrent_impl_ExecutionContextImpl.init___ju_concurrent_Executor__F1
[warn]   called from s_concurrent_impl_ExecutionContextImpl$.fromExecutor__ju_concurrent_Executor__F1__s_concurrent_impl_ExecutionContextImpl
[warn]   called from s_concurrent_ExecutionContext$Implicits$.global$lzycompute__p1__s_concurrent_ExecutionContextExecutor
[warn]   called from s_concurrent_ExecutionContext$Implicits$.global__s_concurrent_ExecutionContextExecutor
[warn]   called from Lexample_H2$class.Lexample_H2$class__$init$__Lexample_H2__V
[warn] 

И я попал в браузер:

uncaught exception: java.lang.RuntimeException: System.getProperty() not implemented

Что отсутствует/не реализовано? Как я могу это реализовать? Есть ли обходной путь? Как я могу реализовать ExecutionContext, который имеет смысл обрабатывать события с браузером?

4b9b3361

Ответ 1

Так как Scala.js 0.6.0, стандартный global ExecutionContext of Scala доступен в Scala.js. Вы можете импортировать его с помощью

import scala.concurrent.ExecutionContext.Implicits.global

// now you get to play with Futures

В Scala.js это псевдоним scala.scalajs.concurrent.JSExecutionContext.Implicits.queue. Этот контекст выполнения помещает задания в стандартный цикл событий JavaScript.

Обратите внимание, что задачи выполняются асинхронно, но не параллельно, поскольку JavaScript не имеет понятия parallelism как таковой. Если требуется parallelism, Web Workers, но они не обеспечивают модель разделяемой памяти, требуемую Future как например.

Старый ответ, применяемый к Scala.js < 0.6.0

Существует 2 существующих и работающих ExecutionContext в scala.scalajs.concurrent.JSExecutionContext, с неявными версиями во внутреннем объекте Implicits. Просто импортируйте тот, который имеет смысл для вас (возможно, queue, а другой не является фактически асинхронным).

import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue

// now you get to play with Futures