[英]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.