我已经创建了一个自定义异步发射器,以便有一个server -> client -> server方法。
然而,它并不像预期的那样起作用。它发出事件,但不运行回调。
启用Socket.IO调试后,我可以看到socket.io:socket正在记录它正在发出正确的事件。
功能代码:
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);
});
}运行函数时使用的一些示例代码:
const res = await asyncEmit<{ statistics: { members: number } }>(
botRegion,
socket,
'statistics',
{ id: botId }
);Socket.IO客户端确实接收发出数据并正确返回数据。
我做错了什么,我该怎么补救?
谢谢!
编辑,客户端代码是:
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。
但是,在服务器端:
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都被记录了。我相信这是我的事件处理程序代码中的一些问题,但是我不能精确地指出它。
发布于 2022-03-23 14:41:17
最后,我重写了代码,不再使用Socket.IO空间,并使用Map<string, Socket>并从那里获取套接字,这样我就可以使用Socket.IO回调了。
这可能不是最好的方法,但这是我唯一能想到的方法。
发布于 2022-03-21 15:06:51
使用Socket.io的回调是不同的,通常称为确认函数。
为了实现回调,发送方需要将函数添加到调用的最后一个参数中。
示例:
发件人
socket.emit("statistics", {test: "just a message"}, (response) => {
console.log(response); // <-- should output "success"
});接收器
socket.on("statistics", (data, callback) => {
console.log(data.test); // <-- should output "just a message"
callback("success");//<-- this will return to the sender/emitter
});超时:
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“
*在你的例子中:
*客户端:*
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
}
}
);服务器端:
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
};根据这个结构编辑你的代码并试一试。
https://stackoverflow.com/questions/71485012
复制相似问题