首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala.js期货

Scala.js期货
EN

Stack Overflow用户
提问于 2014-11-24 18:43:20
回答 1查看 3.5K关注 0票数 27

我试着在Scala.js中使用承诺和未来。承诺行得通,一旦谈到未来,我就会收到警告和错误。

尝试:

代码语言:javascript
复制
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快车:

代码语言:javascript
复制
[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] 

我进入浏览器:

代码语言:javascript
复制
uncaught exception: java.lang.RuntimeException: System.getProperty() not implemented

缺少/未实现的是什么?我如何实现它呢?有解决办法吗?我如何实现一个ExecutionContext,在浏览器中处理事件是有意义的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-24 20:36:39

从Scala.js 0.6.0开始,Scala的标准global ExecutionContext就可以在Scala.js中使用。您可以用

代码语言:javascript
复制
import scala.concurrent.ExecutionContext.Implicits.global

// now you get to play with Futures

在Scala.js中,它是scala.scalajs.concurrent.JSExecutionContext.Implicits.queue的别名。此执行上下文将在标准JavaScript事件循环中排队作业。

注意,任务是异步执行的,但不是并行执行的,因为JavaScript本身没有并行性的概念。如果需要并行性,则需要使用网络工作者,但这些数据不能提供Future所需的共享内存模型。

旧答案应用于Scala.js < 0.6.0

ExecutionContext中有两个现有的和正在工作的scala.scalajs.concurrent.JSExecutionContext,在内部对象Implicits中有隐式版本。只需导入对您有意义的(可能是queue,另一个实际上不是异步的)。

代码语言:javascript
复制
import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue

// now you get to play with Futures
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27111917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档