在 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 内部服务器错误

教程 | face-api.js:在浏览器中进行人脸识别的JavaScript接口

Js调用api接口

如何为 Node JS 设置 REST API

JS Fetch API 禁用 SSL 证书

一起走进Vue.js——Vue.js的全局API