Scala.js全局WebSocket->;无效状态错误
我正在尝试创建一个全局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
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
}