如何实现Socket.IO事件从第二个客户端向发起客户端返回值?
Socket.IO 跨客户端事件回调传递问题解决
问题根源
当前实现无效的核心原因是服务器触发向client2的事件后,未等待client2的回调执行完成就直接返回初始值。socket_manager.emit的callback参数是异步触发的,await emit仅保证事件发送完成,而非回调执行完毕,因此后续的return response会先于回调函数执行,导致返回的仍是初始值"buzz"。
修正后的客户端代码
client1的代码无需修改,但client2需要正确通过回调参数传递响应值:
// client1 代码 export async function fun(data: string): Promise<boolean> { return new Promise((resolve) => { socket.emit("some_event", data, (response: boolean) => { resolve(response); }); }); } // client2 代码(修正回调传递逻辑) socket.on("some_event", (data, callback) => { // 这里可以添加事件处理逻辑 const clientResponse = "client2 response"; // 通过回调参数将结果返回给服务器 callback(clientResponse); });
修正后的服务器代码
使用asyncio.Future实现异步等待,确保拿到client2的回调值后再返回给client1:
import asyncio from fastapi_socketio import SocketManager from typing import Any @socket_manager.on("some_event") # type: ignore async def fun(sid: str, data: Any) -> str: # 创建Future对象用于等待回调结果 response_future = asyncio.Future() async def callback(callback_data: Any): # 将client2的回调值设置到Future中,触发等待逻辑 response_future.set_result(callback_data) # 向client2发送事件并绑定回调 await socket_manager.emit( "some_event", data, to=client2_sid, callback=callback ) # 等待Future完成,即等待client2返回回调值 final_response = await response_future # 将结果返回给client1 return final_response
关键修正说明
- 客户端:client2必须通过
socket.on的第二个回调参数传递响应值,直接return无法被Socket.IO的ACK机制捕获。 - 服务器:通过
asyncio.Future实现异步阻塞等待,确保在获取到client2的回调结果后再返回给client1,彻底解决提前返回初始值的问题。
内容的提问来源于stack exchange,提问作者Jankelele
相关产品推荐
相关产品推荐

