【问题标题】:Is onclose always called after onerror for WebSocket总是在 WebSocket 的 onerror 之后调用 onclose
【发布时间】:2017-02-26 07:40:38
【问题描述】:

是否可以在不会立即调用 onclose 的情况下调用 onerror 回调?换句话说,是否有可能出现WebSocket 错误,该错误与随后关闭的连接不一致?

如果可能的话,我想测试一下这个案例。我有一个使用 node.js 和 express-ws 的模拟后端。后端怎么做才能触发前端的onerror事件回调。

【问题讨论】:

    标签: javascript websocket


    【解决方案1】:

    error 事件只会在触发close 事件之前触发,至少通过正确实现规范的实现,即您将得到errorclose 作为一对,或者只是 close 本身。

    process for closing a websocket consists of 3 steps,如果需要,第二个可以选择触发 error 事件:

    1. 如果要求用户代理使 WebSocket 连接失败,或者如果 WebSocket 连接在标记为已满后关闭,则在 WebSocket 对象上触发一个名为 error 的简单事件。 [WSP]

    在第三步之前调用close:

    1. 创建一个使用CloseEvent 接口的可信事件,事件类型为close...

    而且由于这两个步骤在同一个队列任务中一个接一个,所以您的事件处理程序应该一个接一个地被调用,它们之间不会发生其他事件或任务。

    【讨论】:

    • 我认为如果无法建立连接,您可能会收到错误并且不会关闭,因为连接甚至没有打开。
    • @Safareli 你见过这种情况吗?如果是这样,我认为浏览器将以非标准方式运行 - 正如我的回答中提到的,规范中唯一提到 error 事件触发是在触发 close 之前。如果您确实看到了不同的东西,那么值得了解详细信息(浏览器版本等),因为它可能是一个错误。
    • @Safareli 实际上,规范中提到了如果打开连接失败:”如果建立WebSocket连接算法失败,则触发WebSocket连接算法失败,然后调用关闭WebSocket 连接算法,然后确定 WebSocket 连接已关闭,这会触发如下所述的关闭事件。” - 即与我的回答中概述的相同步骤,因此它真的不应该触发 @987654333 @ 本身。
    • 其实在IE中创建太多websocket时(一个IE浏览器最多6个),那么只会调用一个error,不是通过onerror函数,而是作为一个SCRIPT ERROR(更具体:SCRIPT5022:SecurityError,是被调用的错误)。如果发生这种情况,将不会调用 onclose 方法!
    • @OuuGiii 有趣 - 猜猜这属于我上面的“以非标准方式行事”评论。猜猜它是相当边界线,因为它不是失败的连接(这是触发onerror/onclose),但IE本身甚至拒绝尝试打开另一个。
    猜你喜欢
    • 2014-12-23
    • 2018-02-20
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多