【问题标题】:Socket.io - Prevent multiple events from firingSocket.io - 防止触发多个事件
【发布时间】:2026-02-04 23:40:01
【问题描述】:

我的 iOS 应用和 nodeJS 后端之间设置了 socket.io 连接。

连接后,我像这样设置我的套接字:

    socket.on(EVENT_NAME1, params =>
        someFunc(socket, params)
    );

    socket.on(EVENT_NAME2, params =>
        someOtherFunc(socket, params)
    );

    socket.on(EVENT_NAME3, (params, callback) =>
        someThirdFunc(socket, params, callback)
    );

...

问题是,有时我的 iOS 应用程序会触发多个事件,我想在后端确保,如果多个相同的事件从 250ms 内的一个套接字到达,则只有第一个事件会被执行。

我创建了这个函数:

const timeoutEvent = (eventName, socket, params, callback, func) => {
    socket.off(eventName);
    setTimeout(() => {
        if (callback) {
            socket.on(eventName, (params, callback) => {
                func(socket, params, callback);
            });
        } else {
            socket.on(eventName, params => {
                func(socket, params);
            });
        }
    }, 250);
};

我想这样使用:

socket.on(EVENT_NAME3, (params, callback) => {
    timeOutEvent(EVENT_NAME3, socket, params, callback, someThirdFunc)  
    someThirdFunc(socket, params, callback);
})

问题在于这些行不起作用,因为 eventNameparamscallback 来自 on 函数,而不是来自更高级别的 timeoutEvent 函数 -

socket.on(eventName, (params, callback) => {
    func(socket, params, callback);
});

如何调整上述代码以适应此目的?

【问题讨论】:

  • 据我了解,消费消息。设置一个标志,一旦你收到一条消息,你就将它设置为一个值,它应该在 250 毫秒后恢复到原始值。虽然标志值在这 250 毫秒内设置为另一个值,但消费消息但不做任何事情!

标签: javascript node.js sockets websocket socket.io


【解决方案1】:

在我的connect 函数中,我添加了:

socket.enabled = true

socket.on(EVENT_NAME, (params, callback) => {
    socket.enabled && someFunc(socket, params, callback);
    preventMutlipleHandlers(socket);
});

然后我创建了这个函数:

const preventMutlipleHandlers = socket => {
    socket.enabled = false;
    setTimeout(() => {
        socket.enabled = true;
    }, 250);
};

【讨论】: