javascript - Futuros en Scala.js
promise future (1)
Intenté usar Promesas y futuros en Scala.js. La promesa funciona, tan pronto como se trata de futuros recibo advertencias y errores.
Tratar:
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
}
Y me pongo en 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]
Y me meto en el navegador:
uncaught exception: java.lang.RuntimeException: System.getProperty() not implemented
¿Qué es lo que falta / no se implementa? ¿Cómo puedo implementarlo? ¿Hay una solución? ¿Cómo puedo implementar un ExecutionContext que tenga sentido para manejar los eventos dentro del navegador?
Desde Scala.js 0.6.0, el estándar estándar ExecutionContext
de Scala está disponible en Scala.js. Puedes importarlo con
import scala.concurrent.ExecutionContext.Implicits.global
// now you get to play with Futures
En Scala.js, es un alias para scala.scalajs.concurrent.JSExecutionContext.Implicits.queue
. Este contexto de ejecución pone en cola los trabajos en el bucle de eventos estándar de JavaScript.
Tenga en cuenta que las tareas se ejecutan de forma asíncrona, pero no en paralelo, ya que JavaScript no tiene una noción de paralelismo en sí. Si se requiere el paralelismo, es necesario utilizar Trabajadores Web , pero no proporcionan el modelo de memoria compartida requerido por Future
s como tal.
Respuesta anterior aplicada a Scala.js <0.6.0
Hay 2 ExecutionContext
s existentes y en funcionamiento en scala.scalajs.concurrent.JSExecutionContext
, con versiones implícitas en el objeto interno Implicits
. Simplemente importe el que tenga sentido para usted (probablemente en queue
, el otro no es realmente asíncrono).
import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue
// now you get to play with Futures