Socket.io 正在服务器上获取确认发送/发出

Socket.io 正在服务器上获取确认发送/发出,socket.io,Socket.io,在socket.io确认示例中,我们看到客户端的send/emit被服务器的响应回调。是否在相反方向上提供相同的功能-即服务器如何确认客户端接收到来自服务器的发送/发射?有一个send/emit回调就好了,即使只是为了表示接收成功。在任何地方都没有看到此功能的文档。。。 谢谢 查看我发现服务器发送的消息确实支持ACK(但在广播中不支持!)(socket.io/lib/socket.js的第115-123行): ack应如何工作的示例(未测试): 如果我们想100%确保接收成功,仅仅添加ack呼叫

在socket.io确认示例中,我们看到客户端的send/emit被服务器的响应回调。是否在相反方向上提供相同的功能-即服务器如何确认客户端接收到来自服务器的发送/发射?有一个send/emit回调就好了,即使只是为了表示接收成功。在任何地方都没有看到此功能的文档。。。 谢谢

查看我发现服务器发送的消息确实支持ACK(但在广播中不支持!)(socket.io/lib/socket.js的第115-123行):

ack应如何工作的示例(未测试):


如果我们想100%确保接收成功,仅仅添加ack呼叫是不够的,因为我们还需要知道ack呼叫是否运行

添加此超时示例以演示如何执行此操作。但超时值是个棘手的问题

const withTimeout = (onSuccess, onTimeout, timeout) => {
  let called = false;

  const timer = setTimeout(() => {
    if (called) return;
    called = true;
    onTimeout();
  }, timeout);

  return (...args) => {
    if (called) return;
    called = true;
    clearTimeout(timer);
    onSuccess.apply(this, args);
  }
}

socket.emit("hello", 1, 2, withTimeout(() => {
  console.log("success!");
}, () => {
  console.log("timeout!");
}, 1000));

好的,测试了一下,它看起来是对称的。。。。(太糟糕了,文档对此不清楚)。然而,在测试过程中,我遇到了另一个问题:如果客户端在发送响应之前断开连接,那么发送方上的emit/send回调永远不会被触发。在我看来,如果修改回调机制以包含错误参数,那么API可能会得到改进,例如:socket.emit('ferret','tobi',function(err,data){…….我在这里发布了一个关于我的最新问题的直接问题:,请忽略前面的问题,谢谢。您是否可以发布客户端在侦听事件时如何发送确认的语法?从文档()中,它说客户端套接字.on()仅接受两个参数,eventName和带有服务器发送数据的回调。
// server-side:
io.on('msg', (data, ackCallback) => {
  console.log('data from client', data);
  ackCallback('roger roger');
});

// client-side:
socket.emit('msg', someData, (answer) => {
  console.log('server\'s acknowledgement:', answer);
});
const withTimeout = (onSuccess, onTimeout, timeout) => {
  let called = false;

  const timer = setTimeout(() => {
    if (called) return;
    called = true;
    onTimeout();
  }, timeout);

  return (...args) => {
    if (called) return;
    called = true;
    clearTimeout(timer);
    onSuccess.apply(this, args);
  }
}

socket.emit("hello", 1, 2, withTimeout(() => {
  console.log("success!");
}, () => {
  console.log("timeout!");
}, 1000));