【问题标题】:Vertx Eventbus client with Scala.js带有 Scala.js 的 Vertx Eventbus 客户端
【发布时间】:2017-06-24 22:23:33
【问题描述】:

我正在尝试在 Scala.js 项目中创建一个新的 Vertx Eventbus 实例。无论我做什么,尝试在 onopen 函数中注册处理程序时都会收到 INVALID_STATE_ERR。

似乎 onopen 被过早地触发了。

示例代码: Eventbus.scala:

@js.native
@JSImport("vertx3-eventbus-client",JSImport.Default)
class Eventbus(url:String) extends js.Any{

def registerHandler(address:String,callback:
(js.Dynamic,js.Dynamic)=>Unit): Nothing =js.native

var onopen:Unit=js.native

}

然后,从我的应用程序中,我称之为:

    val eb = new Eventbus("http://localhost:8080/eventbus")
    eb.onopen={
    println("opening")
    eb.registerHandler("activity-updates", (err, mess) => {
      val message = mess.body.toString
      println(message)
    })
  }

【问题讨论】:

    标签: vert.x scala.js scalajs-react


    【解决方案1】:

    您输入的onopen 错误。应该是js.Function0[Unit]

    发生的情况是onopen 中的代码立即执行(而不是“打开时”)。

    改成这样:

    var onopen: js.Function0[Unit]=js.native
    
    eb.onopen={ () =>
    println("opening")
    eb.registerHandler("activity-updates", (err, mess) => {
      val message = mess.body.toString
      println(message)
    })
    

    registerHandler 被立即执行的原因是 Scala(通常)允许语句(因此块)位于表达式位置。

    所以如果我们只看ep.onopen的分配:

    eb.onopen={
      println("opening")
      eb.registerHandler("activity-updates", (err, mess) => {
        val message = mess.body.toString
        println(message)
      })
    }
    

    这会将右侧块的结果(值为Unit)分配给eb.onopen。实际上,这意味着语句会像这样执行:

    println("opening")
    val tmp = eb.registerHandler("activity-updates", (err, mess) => {
      val message = mess.body.toString
      println(message)
    })
    
    eb.onopen=tmp
    

    所以你可以看到registerHandler 甚至在onopen 被分配之前就被执行了。这个特性(表达式位置的语句)当然对于返回 Unit 的东西很少有用。但是,在某些情况下它非常有用。比如临时工:

    val x = {
      val myHelper = ???
      if (myHelper) ???
      else ???
    }
    

    现在myHelper 没有在范围内转义,很明显它只对计算x 有用,以后不再使用。

    【讨论】:

    • 你是对的,谢谢!但是为什么会立即执行呢?
    • 非常感谢,很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多