我们说我有以下方法:
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
?
答案 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
将抛出异常。如果您希望“多次返回该值”,则需要像反应流这样的东西。