如果我重新分配ws.onmessage,我可以错过网络套接字事件吗?

时间:2016-11-26 21:21:15

标签: javascript websocket

我通过下面的函数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)))
};

1 个答案:

答案 0 :(得分:1)

这应该不是问题。在JavaScript中执行的所有代码(假设您在浏览器中运行它)都是单线程的。这意味着您不能遇到竞争条件或任何其他并发问题。当执行替换onmessage值的回调时,通过例如websocket消息访问变量将等待(a.k.a.进入事件队列),直到回调执行完成。

这可能与这个问题没有特别的关系,但是如果你有兴趣学习更多关于JS的事件处理系统和引擎的内部结构,我发现这个谈话非常好:https://youtu.be/8aGhZQkoFbQ < / p>