Socket.io向指定房间发送事件时回调函数失效问题求助
问题分析与解决方案
你遇到的问题核心是:Socket.IO的广播方法(包括socket.to())不支持确认回调(acknowledgement),哪怕房间里只有一个客户端也不行——因为to()本质是广播逻辑,设计上就不追踪单个客户端的回调响应。
下面是两种可行的解决办法:
方法一:直接获取目标Socket实例发送
既然房间里只有一台设备,你可以从Socket.IO的房间中获取对应的单个Socket对象,然后用该对象直接调用emit(),这样就能正常触发回调。
服务器端修改代码:
// 获取目标房间内的所有socket const room = io.sockets.adapter.rooms.get(userId); if (room) { // 取房间里的第一个socket(因为你说只有一个) const targetSocketId = Array.from(room)[0]; const targetSocket = io.sockets.sockets.get(targetSocketId); if (targetSocket) { targetSocket.emit('request-api', options, (response: any) => { console.log(response); }); } }
方法二:自定义响应事件
如果不想依赖房间内的Socket实例获取,可以改用“主动上报”的模式:服务器发送事件后,客户端处理完成主动发送一个响应事件给服务器。
服务器端代码
// 发送请求事件 socket.to(userId).emit('request-api', options); // 监听客户端的响应事件 socket.on('request-api-response', (response) => { console.log(response); });
客户端代码
socket.on('request-api', (arg1) => { console.log(arg1); // 处理完成后主动发送响应 socket.emit('request-api-response', { status: 'ok', }); });
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

