如何在没有竞争的情况下处理所有 WebSocket 错误?

How to handle all WebSocket errors without a race?

当我运行代码

var ws = new WebSocket("wss://mydomain.example/socket/service");
ws.addEventListener("error", function (error)
{
  console.error("Got error=", error);
});

在我可以附加 error 事件的事件侦听器之前,WebSocket 连接是否可能失败(发出 error)?

查看文档https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket我在任何地方都看不到这个细节。

根据 WHATWG spec 看来构造函数应该 运行 请求 并行 – 是否可以保证我可以附加错误侦听器在出现任何可能的错误之前?

WebSocket 构造函数 运行 没有任何类型的同步,并且连接确实可能在 ws.addEventListener("error", ...); 的行之前遇到错误被执行!但是,这不是问题,因为规范还指出,如果出现错误,实际的 error 事件将作为必须作为任务排队的步骤的一部分被触发。实际上,这意味着从逻辑上讲,WebSocket 构造函数需要表现得像 运行 一个零超时的匿名函数,它会触发 error 事件。

所以实际错误可能发生在 JS 代码可以附加事件侦听器之前,但是所有 事件 (open, close, error, message) 只能在下次执行事件循环后 延迟触发 所以上面的代码总是必须在事件可以被执行之前附加事件处理程序解雇了。

详情见https://github.com/whatwg/websockets/issues/13#issuecomment-1039442142