gpt4 book ai didi

javascript - JavaScript 中的事件计时

转载 作者:行者123 更新时间:2023-12-01 00:21:57 28 4
gpt4 key购买 nike

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

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

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

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

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

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

--- 更新 ---

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

最佳答案

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

}

关于javascript - JavaScript 中的事件计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59337876/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com