Deno 的 WebSocket 模块在连接超时时出现 “WebSocket is already in CLOSING or CLOSED state” 错误解决方法

阅读时长 4 分钟读完

前言

Deno 是一个新兴的运行时环境,由于其内置模块的引入和 Deno 自身的安全特性,越来越多的开发者开始使用它进行开发。其中,WebSocket 模块是 Deno 中一个重要的模块,用于在运行时上建立 WebSocket 连接。但是,在使用 WebSocket 模块时,有些开发者可能会遇到一个 “WebSocket is already in CLOSING or CLOSED state” 的错误,使得程序无法正常执行。本文将详细介绍该错误的原因和解决方法,帮助读者避免该错误的出现并提高程序的稳定性。

错误原因

首先,我们看一下 WebSocket 的生命周期。WebSocket 的连接分为四个阶段:

  1. 初始化(ReadyState === 0)
  2. 连接中(ReadyState === 1)
  3. 连接成功(ReadyState === 2)
  4. 断开连接(ReadyState === 3)

当 WebSocket 连接到服务器后,其 ReadyState 从 0 开始变为 2,当连接断开后,ReadyState 变为 3。在连接中时,如果突然断网或者服务器关闭了,ReadyState 会变为 3。在此之后,WebSocket 对象会进入到 CLOSING 状态,然后到 CLOSED 状态。在执行 WebSocket.close() 方法时,也会进入到 CLOSING 状态,然后到 CLOSED 状态。

在 WebSocket 对象已经处于 CLOSED 状态时,如果再次执行 WebSocket.close(),或者发送消息时再次执行 send() 方法,就会出现 “WebSocket is already in CLOSING or CLOSED state” 的错误。

解决方法

解决方法其实很简单,即在进行 WebSocket 操作前,判断 WebSocket 是否处于 CLOSING 或 CLOSED 状态。如果是,则不进行操作。这段判断代码可以使用如下函数实现:

如果你在进行 WebSocket 操作时加上了该判断,就可以避免 “WebSocket is already in CLOSING or CLOSED state” 的错误,提高程序的稳定性。

示范代码

下面是一个示范代码,演示了如何在连接 WebSocket 后,定时向服务器发送消息。

-- -------------------- ---- -------
----- -------- ------------------ -
  ----- ------ - --- ----------------------------------
  ----- --------------- - -----  -- --

  ------------- - -- -- -
    -------------- -- -
      -- -------------------------- -
        --------------------
      -
    -- -----------------
  --

  -------------- - -- -- -
    ------------------------ ---------
  --

  -------------- - -- -- -
    ------------------------ --------
  --   
-

-------- ------------------------ ----------- ------- -
  ------ ------ -- ---- -- ----------------- --- ---------------
-

-------------------

总结

本文介绍了 Deno WebSocket 模块在连接超时时出现 “WebSocket is already in CLOSING or CLOSED state” 错误的原因和解决方法。我们可以借鉴这篇文章的代码示例,避免该错误的出现,并提高程序的稳定性。希望能对 Deno 开发者有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b0a4b648841e9894cb93cd

纠错
反馈