javascript - 如果重新分配 ws.onmessage,我会错过 Web 套接字事件吗?

标签 javascript websocket

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

相关文章:

javascript - d3多折线图溢出

HTML5 Websockets - 这会让我与主机通信吗?

javascript - React Native 在按钮上实现 JSON 字符串

php - 如何使用js在网络浏览器中 trim 图像并将其保存在服务器上?

javascript - AJAX 用于在提交表单时重定向到外部域

javascript - 将选择值重置为默认值

javascript - Spring启动WebSocket连接到 'ws://127.0.0.1:8081/getUsersList/'失败: Error during WebSocket handshake: Unexpected response code: 200

javascript - Websockets 不能在 javascript 和 python 中工作

phpwebsocket 不工作

javascript - 省略号 trim 段落的 setInterval 函数