2017-05-02 10 views
0

グローバルなwebsocket-referenceを作成しようとしていますが、後で自動的に再接続するためにその行を拡張したいと考えています。Scala.jsグローバルWebSocket - > InvalidStateError

しかし、私は、これは意図したとおりに機能しない理由を確認していないここではベビーの手順を実行:

val uri = s"ws://localhost:1337/websocket" 
var websocket: Future[WebSocket] = initWebSocket() 

def initWebSocket() : Future[WebSocket] = { 
    val ws = new WebSocket(uri) 

    ws.onopen = 
     { 
     (event: Event) => log("Websocket connection established") 
     } 

    ws.onmessage = 
     { 
     (event: MessageEvent) => log("Message received") 
     } 

    ws.onclose = 
     { 
     // TODO wait some seconds before trying to reconnect 
     (event: CloseEvent) => 
      log("Close event received") 
     // this.websocket = new WebSocket(uri) 
     } 

    Future(ws) 
} 

私は(スケッチ)oncloseものは絶対でたらめが今であることを完全に承知しています!

def main(): Unit = { 
    websocket.onComplete { 
    case Failure(x) => println("Epic fail!") 
    case Success(x) => { 
     x.send("Test") 
    } 
    } 
} 

私が得るすべては

scala.scalajs.js.JavaScriptException: InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

Websocket connection established

The connection to ws://localhost:1337/websocket was interrupted while the page was loading.

Close event received

され、私もなぜ不思議はありませんよ!

onopenと呼ばれていますが、これをうまく解決するにはどうすればよいですか?私は基本的にはws.onopenがwebsocketを返す前に呼び出されたことを確認する必要があります。私はブロックするのではなく、代わりにいくつかを使用することを好むでしょうPromiseまたはFuture

答えて

2

Hmm。 onopenの後に解決される未来が必要なようです。だから私はそれをこのような何か書き換える可能性がある(心を、私はこれをコンパイルしようとしていない - それは微調整が必​​要になる場合があります):

def initWebSocket() : Future[WebSocket] = { 
    val promise = Promise[WebSocket] 
    val ws = new WebSocket(uri) 

    ws.onopen = 
    { 
    (event: Event) => { 
     log("Websocket connection established") 
     promise.complete(Success(ws)) 
    } 
    } 

    ws.onmessage = 
    { 
    (event: MessageEvent) => log("Message received") 
    } 

    ws.onclose = 
    { 
    // TODO wait some seconds before trying to reconnect 
    (event: CloseEvent) => 
     log("Close event received") 
    // this.websocket = new WebSocket(uri) 
    } 

    promise.future 
} 

この方法では、今後はすぐに完了しない - それが完了したときにあなたをonopenの確認を受けた後には、が必要です。理にかなっている?

+0

完璧な感謝をします、ありがとう! – Sorona

関連する問題