如何在Scala.js中的addEventListener中返回一些内容?

时间:2017-05-13 17:04:46

标签: scala scala.js

我们说我有以下方法:

function comments() {
    return $this->hasMany('App\Comment');
}

可能无法在 def registerBlurEventListener(blur: BlurEvent): Unit = { dom.window.addEventListener("blur", (e: FocusEvent) => { val myObj = BlurEvent.doStuff(blur) // How to return myObj? }} } 方法中返回myObj。但是,这段代码是否可以某种方式重写,以便在不改变addEventListener的情况下获取值myObj

2 个答案:

答案 0 :(得分:1)

在大多数情况下,从myObj返回registerBlurEventListener对你不会有太大帮助,因为你不知道模糊事件发生在什么时间点,而这正是你关心的。

您需要的是表示将来触发的模糊事件的值。您可以使用其中一个流/可观察库(如Monix或RxJS)在方法中创建FocusEvent的流。

然后,您可以将此流作为值传递。您可以订阅它并在每个到达的新事件上调用doStuff。您还可以在流上映射以创建具有转换值的新流。确切的组合取决于您选择的流媒体库以及所需的结果。流通常是惰性的,因此如果要对每个新值运行副作用,则需要订阅流。 (doStuff有点听起来像副作用)。这里详细描述的内容太多了。

使用流,可观察对象和反应变量进行DOM操作的整个库,例如:Outwatch,Binding.scala,Monadic-html。您可能正在寻找的关键字是“功能反应式编程”。

如果您将来只关心单个模糊事件,而不是此类事件的流,请查看Scala.js支持的Javascript Promises。 JS Promises很像流只发出一次并记住它们的发射值。

答案 1 :(得分:0)

我很惊讶没人回答这个问题:)这是期货的主要用例。

import scala.concurrent.{Promise, Future}

def registerBlurEventListener(blur: BlurEvent): Future[MyObj] = {
  val promise = Promise[MyObj]()
  dom.window.addEventListener("blur", (e: FocusEvent) => {
    val myObj = BlurEvent.doStuff(blur)
    promise.success(myObj)
  }}

  promise
}

像这样使用:

import scala.concurrent.ExecutionContext.Implicits.global

val myObj = registerBlurEventListener(???)
myObj.foreach(obj => println(obj))

有几点需要注意:

  • 当然,这不会立即返回值,但会返回您可以再次收听的内容。
  • 仅当您的活动仅触发一次时才有效。下次侦听器触发时,promise.success将抛出异常。如果您希望“多次返回该值”,则需要像反应流这样的东西。