Javascript websocket异步不休眠

问题描述 投票:0回答:2

我有固件背景,主要用普通程序 C 编写代码。

目前我需要一个 Web 浏览器通过专用 TCP 套接字连接到某些硬件并以自定义协议格式交换数据。我们选择采用 Websockets 路线,因为该技术适用于新手机、PC 和平板电脑。

我的问题是Javascript没有真正的Sleep()函数。通常我们会做这样的事情:

  1. 发送消息。
  2. 硬件处理消息时休眠。
  3. 获取响应并继续运行程序。

例如,我想将一些数据保存到硬件中。

  1. 按照协议发送数据。
  2. 获得确认硬件已保存数据的响应。
  3. 如果成功发送消息A,否则发送消息B。

问题是步骤3无法完成,因为没有Sleep。我已阅读有关 setTimeoutfunction() 的内容,但这并不能解决我的问题。让回调事件处理每个接收到的数据包并跳转到不同的函数似乎很混乱。另外,如果我在 while 循环中有大量发送,这对于回调函数来说似乎是不可能的?

我知道我的方法可能是错误的,但有人可以向我解释如何调整我的推理来处理这种情况吗?

如有任何意见或建议,我们将不胜感激。

谢谢,

javascript asynchronous websocket
2个回答
0
投票

你不应该使用 sleep 来等待 Websocket 响应,即使 javascript 中有一个。使用睡眠会使整个站点挂起,等待套接字响应。例如,我所说的“挂起”是指没有来自用户的交互。

要处理无休止的回调,你需要先做一些设计,而不是到处乱扔。

执行此操作的规范方法是为(Web)套接字注册一个处理程序,当服务器向您发送消息时调用该处理程序。您的应用程序会在内部记住它的状态(阅读有关状态机的信息)并知道如何处理此消息,在当前的执行点上。

顺便说一句。如果您的流程只是像您所写的那样询问服务器并等待响应,请考虑使用简单的 AJAX。 WebSocket 旨在允许服务器在决定时将消息推送给接收者,而不仅仅是响应显式请求。 AJAX 是针对此用例而设计的,您可以同步调用它,因此即使没有睡眠,也可以使您的程序保持线性;)


0
投票
<html>
  <head>
  <HTA:APPLICATION ID="oHTA" APPLICATIONNAME="nosleep" MAXIMIZEBUTTON="no" SINGLEINSTANCE="yes">
  <script language="JavaScript">
    var WshShell = new ActiveXObject("WScript.Shell");
    var fso = new ActiveXObject("Scripting.FileSystemObject");

    function nosleep(s) {
      it_tick.value = s;
      if (s === undefined || s < 0) {
        s = 60;
        tp_status.innerText = ":"
      }
      if (s) {
        it_tick.value = s;
      } else {
        WshShell.sendkeys("{F15}");
        it_tick.value = "";
        tp_status.innerText = "7"
      }
      
      setTimeout(function() { nosleep(s - 1) }, 1000);
    }

    function setup_startup() {
      if (! confirm(bt_setup.title)) {
        return;
      }
      if (fso.FileExists(WshShell.SpecialFolders("Startup") + "\\" + oHTA.APPLICATIONNAME + ".lnk")) {
        fso.DeleteFile(WshShell.SpecialFolders("Startup") + "\\" + oHTA.APPLICATIONNAME + ".lnk");
      } else {
        // create the startup icon
        var sLinkFile = WshShell.SpecialFolders("Startup") + "\\" + oHTA.APPLICATIONNAME + ".lnk";
        var oLink = WshShell.CreateShortcut(sLinkFile);

        oLink.TargetPath = oHTA.commandLine.replace(/"/g, '');
        oLink.Save();
      }
      alert("startup setup completed");
      check_setup();
    }

    function check_setup() {
        // check if the startup link already exists
        if (fso.FileExists(WshShell.SpecialFolders("Startup") + "\\" + oHTA.APPLICATIONNAME + ".lnk")) {
          bt_setup.value="M";
          bt_setup.title="clear automatic startup";
        } else {
          bt_setup.value="<";
          bt_setup.title="setup automatic startup";
        }
    }

    // run after the document is loaded
    function body_onload() {
        document.title = document.URL.match(/[^\\]+(?=\.\w+)\b/);
        // adjust window to fit contents
        window.resizeTo(600, 480);
        check_setup();
        nosleep();
    }
  </script>
  </head>
  <body onload="body_onload()">
      <input type="text" id="it_tick" value=0 style="font-size: 24pt; width: 140px; position: absolute; left: 180; top: 100;">
      <p id="tp_status" style="font-family: Wingdings; font-size: 96pt; position: absolute; left: 100;">·</p>
      <input type="button" id="bt_setup" value="" onclick="setup_startup()" style="font-family: Wingdings; position: absolute; right: 0; bottom: 0;">
  </body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.