我通过下面的函数 callRestApi
从 Rest API 接收数据。但是,我收到了通过 websocket 收到的其余数据的更新,我想确保我不会错过任何内容。因此,我在调用其余端点之前开始缓冲 websocket 事件。收到其余响应后,我分派(dispatch)缓冲的事件并开始分派(dispatch)随后收到的任何新内容,更新我的数据副本。但我正确地实现了这一点吗?特别是,是否存在我可能会错过函数 startDispatchingEvents 中的事件的风险,在该函数中我为 ws.onmessage
分配了一个新值。我正在使用 redux 调度程序。
export const startBufferingEvents = () => {
eventBuffer = [];
ws.onmessage = msg => {
eventBuffer.push(msg);
}
};
export const startDispatchingEvents = (dispatcher) => {
eventBuffer.forEach(evt => dispatcher(evt));
ws.onmessage = evt => dispatcher(evt);
};
startEventBuffering()
.then(()=>callRestApi())
.then(restResponse=>dispatch(action(restResponse)))
.then(()=>startDispatchingEvents((evt)=>eventDispatcher(dispatch, evt)))
};
最佳答案
这应该不是问题。在 JavaScript 中执行的所有代码(假设您在浏览器中运行)都是单线程的。这意味着您不会遇到竞争条件或任何其他并发问题。当执行替换 onmessage
值的回调时,通过 Websocket 消息访问变量将等待(也称为进入事件队列),直到回调执行完成。
这可能与这个问题没有特别相关,但是如果您有兴趣更多地了解 JS 的事件处理系统和引擎的内部结构,我发现这个演讲非常好:https://youtu.be/8aGhZQkoFbQ
关于javascript - 如果重新分配 ws.onmessage,我会错过 Web 套接字事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823282/