我正在从我的网页连接到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块中的数组。我认为这应该处理所有可能的情况。如果没有,您可以建议吗?