JavaScript 中的活动时间

Event timing in JavaScript

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

在我的点击例程中,我正在做

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

然后在 socket.onOpen 中,我 post 使用 shift();

来自 msgsArray 的所有消息

但似乎存在竞争条件,如果在我检查网络套接字未打开之后但在我将消息添加到数组之前打开套接字。

因为 JavaScript 是单线程的,所以实际上没有竞争条件吗?如果不是,我有什么方法可以让这个 "thread" 安全吗?是否保证只有在我的点击事件处理完成后才会调用onOpen?

---更新---

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

阅读 WebSocket.send 上的文档后,我更新了我的代码以完全 "race-safe"

  //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?');
  }

}