我通过下面的函数callRestApi
从rest api接收数据。但是,我收到通过websocket收到的其余数据的更新,我想确保我不会错过任何东西。因此,我在调用rest端点之前开始缓冲websocket事件。收到其余的响应后,我发送缓冲的事件并开始调度随后收到的任何新内容,更新我的数据副本。但我是否正确实施了这个?特别是,我可能会错过函数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)))
};
答案 0 :(得分:1)
这应该不是问题。在JavaScript中执行的所有代码(假设您在浏览器中运行它)都是单线程的。这意味着您不能遇到竞争条件或任何其他并发问题。当执行替换onmessage
值的回调时,通过例如websocket消息访问变量将等待(a.k.a.进入事件队列),直到回调执行完成。
这可能与这个问题没有特别的关系,但是如果你有兴趣学习更多关于JS的事件处理系统和引擎的内部结构,我发现这个谈话非常好:https://youtu.be/8aGhZQkoFbQ < / p>