我试图在一个使用Websockets的项目中健壮化错误处理代码。(例如,是否已收到开放活动?是否已收到针对我们项目的各种数据包?))来决定发生了哪种关闭/错误,然后立即注销事件处理程序并销毁对WebSocket的所有引用。
我一直在考虑使用状态码,但是尽管close事件提供了这个功能,error事件却没有,而且error事件似乎总是先发送。所以如果我在第一个事件发送时清理WebSocket,我将永远不会收到状态码。
显而易见的解决方案是忽略error事件,只处理close事件,但这引起了一个问题:如果error事件没有在其后立即触发close事件,是否可以触发error事件?(如果是的话,修改后的代码会漏掉它。)我能看到的规范中唯一相关的部分是这一部分,它指出当连接关闭时,第2步触发一个错误事件,第3步触发一个关闭事件,但我看不到任何声明错误事件由于其他原因不能被触发的东西。
如果一个答案可以指向我的一部分规范,证明这一点,这将是非常感谢。
2条答案
按热度按时间2eafrhcq1#
我相信你阅读规范是正确的--没有其他引用提到
error
事件的引发,这意味着你将看到error
事件触发的唯一时间是在WebSocket关闭期间(如果它有错误,而不是在“正常”关闭期间),并且它将总是跟随着close
事件。假设在
close
事件期间,您可以检查事件信息以确定它是否完全关闭,人们想知道error
事件的目的是什么-似乎您只需要担心处理close
事件,并查看wasClean
和reason
属性以确定它是否是由于错误引起的。mbyulnm02#
你可以在RFC 6455中读到这一点。在Opening handshake部分,它是这样说的:
1.如果无法打开连接,无论是因为直接连接失败还是因为使用的任何代理返回错误,那么客户端必须 * 使WebSocket连接失败 * 并中止连接尝试。
在失败的WebSocket连接部分,我们发现(强调我的):
某些算法和规范要求端点 * 使WebSocket连接失败 *。为此,**客户端必须 * 关闭WebSocket连接 *,并可能以适当的方式向用户报告问题(这对开发人员特别有用)。同样,为此,服务器必须 * 关闭WebSocket连接 *,并应记录问题。
这似乎表明
close
事件将被一致地触发。然而,继续:如果在要求端点 * 使WebSocket连接失败 * 之前 * 建立了WebSocket连接 *,则端点应发送带有适当状态代码的关闭帧(第7.4节)在继续 * 关闭WebSocket连接 * 之前。如果端点认为另一端不太可能接收和处理关闭帧,则可以省略发送关闭帧,由于导致WebSocket连接首先失败的错误的性质。在被指示 * 使WebSocket连接失败 * 之后,端点不得继续尝试处理来自远程端点的数据(包括响应的Close帧)。
如果一开始就没有建立连接(没有HTTP升级),它可能不会被触发。
结论如下:确实有可能
error
在没有close
的情况下被触发,你可以通过打开Dev Tools(F12)在the datatracker.ietf.org website上测试它,并在控制台中运行:字符串
它只报告
ws error
和一条抱怨内容安全策略配置的消息。因此不会触发close
事件。这对于处理自动重新连接等问题来说有点烦人。特别是因为你也不能检查
readyState
,这在每种情况下都表示WebSocket.CLOSED
(3
)。任何解决方案都需要一个标志来指示已经调用了回调,或者在error
事件处理程序中,你需要从close
中删除回调以防止双重回调。