首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Socket.IO - socket.on未被运行

Socket.IO - socket.on未被运行
EN

Stack Overflow用户
提问于 2022-03-15 15:42:19
回答 2查看 441关注 0票数 3

我已经创建了一个自定义异步发射器,以便有一个server -> client -> server方法。

然而,它并不像预期的那样起作用。它发出事件,但不运行回调。

启用Socket.IO调试后,我可以看到socket.io:socket正在记录它正在发出正确的事件。

功能代码:

代码语言:javascript
复制
export async function asyncEmit<T>(
  region: string,
  socket: Server,
  event: string,
  data: {
    id: any;
    [k: string]: any;
  }
): Promise<{ result: T; error: boolean }> {
  return new Promise((resolve, reject) => {
    socket.to(region).emit(event, data);

    const cb = (res: { result: T; error: boolean }, ack: any) => {
      ack();
      if (res.error) {
        reject(res.result);
      }
      socket.off(`${data.id}-${event}`, cb);
      resolve(res);
    };

    socket.on(`${data.id}-${event}`, cb);
    setTimeout(() => {
      socket.off(event, cb);
      reject('Timed out.');
    }, 5000);
  });
}

运行函数时使用的一些示例代码:

代码语言:javascript
复制
    const res = await asyncEmit<{ statistics: { members: number } }>(
      botRegion,
      socket,
      'statistics',
      { id: botId }
    );

Socket.IO客户端确实接收发出数据并正确返回数据。

我做错了什么,我该怎么补救?

谢谢!

编辑,客户端代码是:

代码语言:javascript
复制
        this.socketio.timeout(5000).emit(
          `${uuid}-statistics`,
          {
            result: { statistics: { members: guild.memberCount } },
            error: false,
          },
          (data: any, err: any) => {
            if (err) {
              this.logger.error(err);
            }
            if (data) {
              return;
            }
          }
        );

它会超时并记录socket.io-client:socket event with ack id 0 has timed out after 5000 ms +5s

但是,在服务器端:

代码语言:javascript
复制
  socket.io:socket got packet {"type":2,"nsp":"/","id":0,"data":["......-statistics",{"result":{"statistics":{"members":35}},"error":false}]} +3s
  socket.io:socket emitting event ["......-statistics",{"result":{"statistics":{"members":35}},"error":false}] +0ms
  socket.io:socket attaching ack callback to event +0ms
  socket.io:socket dispatching an event ["......-statistics",{"result":{"statistics":{"members":35}},"error":false},null] +0ms

都被记录了。我相信这是我的事件处理程序代码中的一些问题,但是我不能精确地指出它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-23 14:41:17

最后,我重写了代码,不再使用Socket.IO空间,并使用Map<string, Socket>并从那里获取套接字,这样我就可以使用Socket.IO回调了。

这可能不是最好的方法,但这是我唯一能想到的方法。

票数 1
EN

Stack Overflow用户

发布于 2022-03-21 15:06:51

使用Socket.io的回调是不同的,通常称为确认函数

为了实现回调,发送方需要将函数添加到调用的最后一个参数中。

示例:

发件人

代码语言:javascript
复制
socket.emit("statistics", {test: "just a message"}, (response) => {
  console.log(response); // <-- should output "success"
});

接收器

代码语言:javascript
复制
socket.on("statistics", (data, callback) => {
  console.log(data.test); // <-- should output "just a message"
  callback("success");//<-- this will return to the sender/emitter
});

超时:

代码语言:javascript
复制
socket.timeout(5000).emit("statistics", {test: "just a message"}, (err, response) => {
  if (err)
    // the event was not acknowledged by the receiver in the delay given
  else
    console.log(response); // <-- output is "success"
});

注意到回调的第一个参数是"error“

*在你的例子中:

*客户端:*

代码语言:javascript
复制
    this.socketio.timeout(5000).emit(
      `${uuid}-statistics`,
      {
        result: { statistics: { members: guild.memberCount } },
        error: false,
      },
      (err: any, data: any) => {
        if (err) {
          this.logger.error(err);
        }
        if (data) {
          console.log(data);//<-- this is where your callback resolves to
        }
      }
    );

服务器端:

代码语言:javascript
复制
const cb = (res: { result: T; error: boolean }, ack: any) => {
  //do whatever you want with res
  if (res.error) {
    console.log("Error:",res.result);
    ack("Errorfrom server");
  }

  socket.off(`${data.id}-${event}`, cb);
  console.log("Success:",res.result)

  ack("Success from server");//<--this callback will send back to the emitter
};

根据这个结构编辑你的代码并试一试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71485012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档