本文介绍了运行一个简单的Scala.React表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在查看Scala.React和更新后的paper on the issue,尝试使用一个简单的Signal
示例。
我知道本文中的Signal
方法本身并不存在,而是有Strict
和Lazy
。所以我天真的第一次尝试:
设置整个过程:
object dom extends scala.react.Domain {
val engine = new Engine
val scheduler = new ManualScheduler
}
import dom._
试用作文:
val v1, v2 = Var(0)
val f = Strict { v1() + v2() }
第二行崩溃,
java.lang.AssertionError: assertion failed: This method must be run on its domain
scala.react.NilDebug@4eaf6cb1
at scala.Predef$.assert(Predef.scala:179)
at scala.react.Debug.assertInTurn(Debug.scala:37)
at scala.react.EngineModule$Propagator.defer(EngineModule.scala:120)
...
所以我一定是做错了什么。但是什么?
第二次尝试:
scala> dom.start()
scala> var v1, v2, f = (null: Signal[Int])
v1: dom.Signal[Int] = null
v2: dom.Signal[Int] = null
f: dom.Signal[Int] = null
scala> schedule { v1 = Var(0); v2 = Var(0) }
scala> schedule { f = Strict { v1() + v2() }}
scala> engine.runTurn()
scala> schedule { println(f.now) }
scala> engine.runTurn()
Uncaught exception in turn!
scala.react.EngineModule$LevelMismatch$
推荐答案
好,所以如果我们想保留对这些信号的引用,首先应该使用Lazy
而不是Strict
,因为Strict
需要在计划的转弯内运行。
以下是我的新尝试。不确定这是否是预期的方式,但它是有效的:
object Test extends scala.react.Domain with App {
val engine = new Engine
val scheduler = new ManualScheduler
val v2 = Var(0)
val v1 = Lazy { v2() + 10 }
val f = Lazy { v1() + v2() }
start()
schedule {
new Observing {
observe(f) { p =>
println(s"Observed: $p")
}
}
v2() = 5
}
runTurn()
}
这篇关于运行一个简单的Scala.React表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!