Socket.io-防止触发多个事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket.io-防止触发多个事件相关的知识,希望对你有一定的参考价值。

我在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);
);

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

答案

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);
;

以上是关于Socket.io-防止触发多个事件的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 连接事件未在 Firefox 中触发

Socket.io 消息事件多次触发

socket.io:没有触发断开事件

socket.io - 'connect' 事件不会在客户端触发

当我的网站在多个窗口中打开时,在实时事件中打开 window.open(使用 socket.io)

Socket IO事件多次触发NodeJS