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

JavaScript中如何使用socket.on接收socket.emit对应返回数据

解决方案

你当前使用的是Socket.io内置的**确认应答(Acknowledgement)**机制,emit最后携带的回调本身就可以直接接收服务端返回的响应,不需要额外写socket.on监听。如果需要使用socket.on的模式实现通信,需要客户端和服务端同步调整逻辑:

1. 客户端侧调整

  • 发送请求时去掉emit末尾的回调函数
  • 注册对应事件的监听,接收服务端推送的返回结果
// 发送取票请求
socket.emit( 'attend-ticket', { desktop });

// 监听服务端返回的处理结果
socket.on('attend-ticket-response', ( { ok, ticket, msg } ) => {
  if ( !ok ) {
    lblTicket.innerText = 'Nothing.';
    return divAlerta.style.display = '';
  }
  lblTicket.innerText = 'Ticket ' + ticket.number;
});

2. 服务端侧调整

服务端接收到attend-ticket请求处理完成后,主动向客户端推送同名的响应事件即可:

// 服务端示例代码(Node.js环境)
socket.on('attend-ticket', (data) => {
  const { desktop } = data
  // 内部业务逻辑处理,生成票务信息
  const result = {
    ok: true,
    ticket: { number: '001' },
    msg: '取票成功'
  }
  // 推送结果给客户端
  socket.emit('attend-ticket-response', result)
})

两种方案的选择建议

  • 如果你只是单次请求+单次响应的场景,保留你原来的emit+回调的写法即可,逻辑更简洁,回调只会触发一次,不需要额外维护事件监听
  • 如果你需要服务端后续多次推送同类型的状态更新(比如票务排队进度、状态变更),使用socket.on的模式更合适

内容的提问来源于stack exchange,提问作者Cristian Romero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 13:36:04