如何等待 WebSocket 就绪状态更改

2024-05-12

我正在尝试实现一个可以回退到轮询的 WebSocket。如果WebSocket连接成功,readyState变为1,但如果失败,readyState是 3,我应该开始轮询。

我尝试过这样的事情:

var socket = new WebSocket(url);
socket.onmessage = onmsg;
while (socket.readyState == 0)
{
}
if (socket.readyState != 1)
{
    // fall back to polling
    setInterval(poll, interval);
}

我正期待着socket.readyState异步更新,让我立即阅读。然而,当我运行这个程序时,我的浏览器冻结了(我将其打开了大约半分钟才放弃)。

我想也许有一个onreadyStateChanged事件,但我在 MDN 参考中没有看到这一事件。

我应该如何实施这个?显然空循环是行不通的,而且没有任何事件可以实现这一点。


这很简单,而且工作完美...您可以添加有关最大时间或尝试次数的条件,以使其更加稳健...

function sendMessage(msg){
    // Wait until the state of the socket is not ready and send the message when it is...
    waitForSocketConnection(ws, function(){
        console.log("message sent!!!");
        ws.send(msg);
    });
}

// Make the function wait until the connection is made...
function waitForSocketConnection(socket, callback){
    setTimeout(
        function () {
            if (socket.readyState === 1) {
                console.log("Connection is made")
                if (callback != null){
                    callback();
                }
            } else {
                console.log("wait for connection...")
                waitForSocketConnection(socket, callback);
            }

        }, 5); // wait 5 milisecond for the connection...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何等待 WebSocket 就绪状态更改 的相关文章

随机推荐

  • 从底部工作表对话框片段中获取值

    我从片段A开始bottomSheetDialogFragment 我想从该bottomSheetDialogFragment中选择日期 然后将其设置在片段A中 选择日期已经完成 我只想将其获取到片段A中以在某些字段中设置它 我怎样才能得到这
  • git:如何查明某个分支是否有拉取请求?

    我在 git 分支上 有没有办法查看该分支是否有拉取请求 在这种特殊情况下 Atlassian Stash 用于管理拉取请求 当然我可以使用Stash的Web界面来搜索拉取请求 但我也可以仅使用 git 命令行工具从脚本执行此操作吗 Cor
  • Gradle 无法在新的 Android Studio 2.0 中同步我的项目

    我刚刚将 Android Studio 从 1 5 升级到 2 0 即安装了全新版本 升级似乎进行得很顺利 但是当我打开项目时 当 Gradle 同步我的项目时 我遇到了问题 Gradle 同步运行几分钟后 我收到此错误 Failed to
  • 使用 Byte Buddy 拦截对 Java 8 lambda 表达式的调用

    我尝试使用 Byte Buddy 拦截对方法的调用和对 Java 8 lambda 表达式的调用AgentBuilder如下 static final Instrumentation inst ByteBuddyAgent install
  • 求 matplotlib 中绘制的两条曲线之间的面积(fill_ Between area)

    我有一个清单x and y两条曲线的值 两者都有奇怪的形状 而且我没有它们中任何一个的函数 我需要做两件事 绘制它并对曲线之间的区域进行着色 如下图所示 求曲线之间阴影区域的总面积 我可以绘制这些曲线之间的区域并对其进行着色fill bet
  • 如何使用 jQuery 在第二次单击时反转 CSS 动画

    我制作了以下菜单图标 CSS 动画 当我点击它时会触发它 当我使用 jQuery 第二次单击它时 我想使其反向动画 path1 stroke dasharray 33px stroke dashoffset 33px animation l
  • 如何以最佳方式传递元组参数?

    如何以最佳方式传递元组参数 Example def foo Int Int def bar a Int b Int 现在我想传递的输出foo to bar 这可以通过以下方式实现 val fooResult foo bar fooResul
  • 如何在 NodeJS 中允许表单数据

    我最近创建了一个接受文件的 API 我正在尝试使用 Postman 测试 API 如果我使用发出帖子请求x wwww form urlencoded身体类型 一切正常 我得到了所有预期的数据 唯一的问题是它不允许发送文件 如果我使用form
  • 关于文件 file = new File(路径)

    The Java iO 文件 http docs oracle com javase 6 docs api java io File html File 28java lang String 29文档说了以下关于其构造函数的内容 该构造函数
  • xml 拉解析器资产 xml

    如何使用拉解析器解析资产文件夹中的本地 XML 文件 我无法让拉解析器工作 它总是抛出 io 异常 我想我无法获取文件的路径或连接到该文件 mixm 我正在尝试各种方法来从 资产 和 资源 加载本地文件 但要按要求回答您的问题 因为其他人似
  • 在 java 8 中找不到 AnnotationProcessorFactory 类

    我有一个项目是建立在java 1 6 and 现在我将java版本升级到1 8 and构建项目 这里我使用 gradle 来构建项目 这是等级代码 task wsgen dependsOn compileJava doLast ant ta
  • asp.net core 1 appsettings.product.json 不更新连接字符串

    我在生产环境中有一个应用程序 使用在 IIS 上运行的 net core RC1 我重新编写了该应用程序 因为该公司希望将其放在 net core1 上 因为那是正式版本 在我的 net core RC1 应用程序中 我有 config j
  • Nodejs:在哪里或如何编写复杂的业务逻辑?

    最近我接触到了node js 和一些很酷的包 比如express 和jade 我一直有几个问题不断地敲我的门 如果我选择 Node js 来构建我的下一个网站 我将使用 JavaScript 来编写服务器端复杂的逻辑 但我不认为你可以将 J
  • 具有灵活数组成员的结构的大小

    Given struct Foo uint32 t a uint32 t b What is sizeof Foo 它是实现定义的行为还是未定义的行为 C 和 C 的答案是否不同 编译器将忽略灵活数组成员 因为它不存在 C11 6 7 2
  • 找不到模块“@angular/platform-b​​rowser/animations”

    我收到错误 ts 找不到模块 angular platform b rowser animations 我已经安装了以下内容 npm install save Angular Material Angular cdk npm install
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • java设置图像的分辨率和打印尺寸

    我编写了一个程序 生成一个 BufferedImage 以显示在屏幕上 然后打印 图像的一部分包括 1 像素宽的网格线 即 一行为1个像素 行与行之间大约有10个像素 由于屏幕分辨率的原因 图像显示得比这大得多 每行有几个像素 我想将其绘制
  • 检索除指定一列之外的所有 DataFrame [重复]

    这个问题在这里已经有答案了 有没有办法选择 pandas DataFrame 对象中除一列之外的所有列 我已经看到了删除列的方法 但我不想这样做 use drop method df drop column name axis 1
  • 同一页面中多个表单上的 Google 隐形 ReCaptcha - PHP

    我正在我的 php 网站上关注这个 Invisible ReCaptcha 文档 http www pinnacleinternet com installing invisible recaptcha http www pinnaclei
  • 如何等待 WebSocket 就绪状态更改

    我正在尝试实现一个可以回退到轮询的 WebSocket 如果WebSocket连接成功 readyState变为1 但如果失败 readyState是 3 我应该开始轮询 我尝试过这样的事情 var socket new WebSocket