在 JS API 内部和为 JS API 建立 WebSocket 连接
Posted
技术标签:
【中文标题】在 JS API 内部和为 JS API 建立 WebSocket 连接【英文标题】:Establishing WebSocket Connection within and for a JS API 【发布时间】:2014-02-18 22:57:27 【问题描述】:目标:为了提供一个简单易用的与服务器通信的 JS 库,我尝试在我的 API 开始时建立 WebSocket 连接并定义库的功能此后。
问题:问题是在加载库和运行用户脚本之前,我的套接字的就绪状态不会转换为 1(就绪)。对此进行调试已确认这一点,我不确定如何确保在继续执行用户脚本之前建立我的 WebSocket。
我有什么:
(function(myObject)
var socket = new WebSocket(url);
socket.emit = function()
//do some tasks and create a var "message"
socket.send(message);
window.myObject = myObject.prototype =
doSomething: function()
socket.emit();
(myObject = window.myObject || ));
在上面,我在套接字对象上定义了一个自定义方法 (socket.emit()),该方法又调用 socket.send()。我这样做是为了在通过 socket.send() 发送之前操作一些数据,重用否则会重复的代码。
然后我有一些非常基本的 html 包含这个 JS 库和一个简单的脚本运行如下:
$(document).ready(function()
myObject.doSomething();
);
我得到的错误是:“无法在 'Websocket' 上执行 'send':已经处于 CONNECTING 状态。”
库成功加载,但在客户端脚本运行之前 Websocket 未完成连接。在 API 完成加载之前,如何确保我的 WebSocket 已连接(就绪状态 == 1)?
感谢您的帮助!
【问题讨论】:
您正在对文档就绪运行 doSomething,但连接尚未就绪。您应该查看可用于您的连接的事件(onOpen、onClose、onMessage、onError)并重组您的调用,以便连接准备好发送消息。 是的,但最终我不会是编写调用库的脚本的人。我想在幕后处理所有套接字业务,以便最终用户可以简单地拨打他们想要的电话。 【参考方案1】:只要套接字未连接,您可以缓冲socket.emit
中的所有消息,并在收到onOpen
回调后发送它们。
虽然这将解决您当前的问题,但您会看到新的问题会出现: 您可能希望处理与服务器的断开连接并重新连接,因此您可能需要扩展您的库 API 以公开连接状态更改事件并强制库用户仅在连接时发送消息。
【讨论】:
以上是关于在 JS API 内部和为 JS API 建立 WebSocket 连接的主要内容,如果未能解决你的问题,请参考以下文章
Next.js 服务器端 api 调用返回 500 内部服务器错误