Scala.js全局WebSocket->;无效状态错误

Scala.js全局WebSocket->;无效状态错误,scala,asynchronous,websocket,promise,scala.js,Scala,Asynchronous,Websocket,Promise,Scala.js,我正在尝试创建一个全局websocket引用,稍后我将扩展该引用以自动重新连接 但是,在这里进行小步操作,我不确定这为什么不能按预期工作: val uri = s"ws://localhost:1337/websocket" var websocket: Future[WebSocket] = initWebSocket() def initWebSocket() : Future[WebSocket] = { val ws = new WebSocket(uri

我正在尝试创建一个全局websocket引用,稍后我将扩展该引用以自动重新连接

但是,在这里进行小步操作,我不确定这为什么不能按预期工作:

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:试图使用不可用或不再可用的对象

已建立Websocket连接

加载页面时,与ws://localhost:1337/websocket的连接中断

已收到关闭事件

我甚至不想知道为什么


调用onopen太晚了。。。但如何优雅地解决这个问题呢?我基本上需要确保在返回websocket之前调用了
ws.onopen
。我不想阻止,而是使用一些
承诺
未来
嗯。似乎你需要在
开启
后才能解决未来问题。所以我可能会这样重写它(注意,我还没有尝试编译它——它可能需要调整):

这样,未来不会立即完成——它会在您希望它完成时完成,这是在您获得
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
}