You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:02:37