2017-06-22 11 views
0

Scala.jsプロジェクトで新しいVertx Eventbusインスタンスを作成しようとしています。私が何をしていても、onopen関数でハンドラを登録しようとすると、INVALID_STATE_ERRを取得します。Vertx Scala.jsを使用したEventbusクライアント

オンオープンが時期尚早に発射されているようです。

例コード: 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 

}

は、私のアプリから、私はそれを呼び出す:onopen

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) 
    }) 
    } 

答えて

0

あなたのタイピングが間違っています。おそらくjs.Function0[Unit]であるはずです。

どうすればonopenのコードが(「開く」ではなく)すぐに実行されます。これに

変更:registerHandlerはすぐに実行しまっ

var onopen: js.Function0[Unit]=js.native 

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

理由は、(一般的に)Scalaは表現位置にある(したがって、およびブロック)のステートメントを可能にすることです。だから、

我々だけep.onopenへの割り当てを見れば:

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

これはeb.onopenに(値Unitの)右側のブロックの結果を割り当てます。

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

eb.onopen=tmp 

ですから、registerHandleronopenがさえ割り当てられていても前に実行されることを見ることができます。実際にこのステートメントを次のように実行され得ることを意味します。この機能(表現位置のステートメント)はもちろん、Unitを返すものにはあまり役に立ちません。しかし、非常に有用な場合があります。たとえば、一時:

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

は今myHelperは、スコープ内に脱出しないと、xではなく、後でもう使用を計算する場合にのみ有用であることが明らかです。

+0

ありがとうございます!しかし、なぜそれはすぐに実行されたのですか? – Anton

+0

私は答えを更新しました。 – gzm0

+0

ありがとう、非常に便利です。 – Anton

関連する問題