簡體   English   中英

Nodejs + ReactJS socket.io關閉/ removeListener不起作用

[英]Nodejs + ReactJS socket.io off/removeListener not working

我正在嘗試在我的react / nodejs應用程序上實現socket.io。 我可以成功訂閱一個事件並將數據推送到前端。 但是當不再需要某個事件時,我無法取消訂閱。

版本 socket.io-2.0.4 socket.io-client-2.0.4

下面是示例代碼

前端

subscribeForTimer() {
    socket.on('timer', timestamp => {
        console.log(timestamp)
    });
    socket.emit('subscribeToTimer', 1000);
}

UnubscribeFromTimer() {
    socket.removeListener ( 'timer', (data) => {
        console.log ( 'stopped' )
    } );
}

后端

const socketServer = http.createServer ();
// create a server instance with the port and host
socketServer.listen ( port, host );

// Make the sockets listen on the created server instance
const sio = io.listen ( socketServer );
sio.sockets.on ( socketEvents.CONNECTION, ( socket ) => {
    subscribeToTimer ( socket );
    UnubscribeFromTimer ( socket );
    terminateConnection ( socket );
} );
function subscribeToTimer ( socket ) {
    socket.on ( 'subscribeToTimer', ( interval ) => {
        setInterval ( () => {
            socket.emit ( 'timer', new Date () );
        }, interval );
    } );
}

我嘗試使用off / removeListener / removeAllListeners,但沒有任何效果。 它也不會引發任何錯誤。 任何幫助深表感謝。 TIA!

您應該傳遞相同的已訂閱函數實例以取消訂閱:

在前端:

 const subscribeFn = timestamp => { console.log(timestamp) } subscribeForTimer() { socket.on('timer', subscribeFn); socket.emit('subscribeToTimer', 1000); } UnubscribeFromTimer() { socket.removeListener('timer', subscribeFn); } 

在后端

 const socketServer = http.createServer (); // create a server instance with the port and host socketServer.listen ( port, host ); // Make the sockets listen on the created server instance const sio = io.listen ( socketServer ); let intervalId; sio.sockets.on ( socketEvents.CONNECTION, ( socket ) => { subscribeToTimer ( socket ); intervalId && clearInterval(intervalId) UnubscribeFromTimer ( socket ); terminateConnection ( socket ); } ); function subscribeToTimer ( socket ) { socket.on ( 'subscribeToTimer', ( interval ) => { intervalId = setInterval ( () => { socket.emit ( 'timer', new Date () ); }, interval ); } ); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM