本文介绍了运行一个简单的Scala.React表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在查看Scala.React和更新后的paper on the issue,尝试使用一个简单的Signal示例。

我知道本文中的Signal方法本身并不存在,而是有StrictLazy。所以我天真的第一次尝试:

设置整个过程:

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表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-09 11:07