簡體   English   中英

JavaScript 中的事件計時

[英]Event timing in 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 塊中的數組中。 我認為這應該處理所有可能的情況。 如果沒有,你能建議嗎?

閱讀有關 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?');
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM