JavaScript中的事件计时

我正在从我的网页连接到Web套接字服务器,并通过它向服务器发送点击事件。

在点击程序中,我正在做

if (socket.readyState === WebSocket.OPEN) {
  //send
}else {
  msgsArray.push(messages)
}

然后在socket.onOpen中,我使用shift();发布来自msgsArray的所有消息。

但是,如果我在检查Web套接字未打开之后但在将消息添加到数组之前打开了套接字,则似乎存在竞争的情况。

因为JavaScript是单线程的,实际上是否没有竞争条件?如果没有,我有什么办法可以使此“线程”安全?是否保证只有在我的点击事件处理完成后才会调用onOpen?

---更新---

我所指的竞争条件是我正在检查的地方socket.readyState不是OPEN,但是它变为OPEN,并且在将消息添加到数组之前调用了socket.onopen。但是实际上我不认为这会发生,是吗?在点击例程完成之前无法调用onopen,对吗?但是相反,socket.readyState是OPEN,但是在我写它的时候就关闭了呢?我将在其周围添加try catch并将其添加到catch块中的数组。我认为这应该处理所有可能的情况。如果没有,您可以建议吗?

foxconn_fy 回答:JavaScript中的事件计时

阅读WebSocket.send上的文档后,我将代码更新为完全“种族安全”

  //Obj.socketMessagesToSend is a JS array ([])
  if (Obj.socket && Obj.socket.readyState === WebSocket.OPEN) {
    try {
      Obj.socket.send(JSON.stringify(report));
    } catch (e) {
      Obj.socketMessagesToSend.push(JSON.stringify(report));
      Obj.connectToWebSocket();
    }
  } else {
    Obj.socketMessagesToSend.push(JSON.stringify(report));
    Obj.connectToWebSocket();
  }

Obj.connectToWebSocket() = function() {
  if (Obj.socket && (Obj.socket.readyState === WebSocket.CONNECTING || Obj.socket.readyState === WebSocket.OPEN)) return;
  if (typeof Config.WebSocketInfo != 'object') return;
  if (!Config.WebSocketInfo.enabled) return;

  try {

    Obj.socket = new WebSocket(Config.WebSocketInfo.url);
    Obj.socket.onmessage = Obj.socketOnMessage;
    Obj.socket.onopen = function(e) {
//      console.log("Web Socket Connection established!");
      while (Obj.socketMessagesToSend.length != 0) {
        Obj.socket.send(Obj.socketMessagesToSend.shift());
      }
    }
  } catch (e) {
    console.log('Could not connect. Is connection blocked by your content-security-policy?');
  }

}
本文链接:https://www.f2er.com/2921143.html

大家都在问