Await socket.on('answerToRequest') 可能与 Socket.io?



以下可能吗?

async function doesSocketAgree(){
socket.emit('doesOtherSocketAgree', otherSocketId);
await socket.on('responseDoesSocketAgree', (answer)=>{
console.log('answer');
});
}

在 socket.io 中,您可以使用"确认"回调:

async function doesSocketAgree(){
await new Promise(resolve => {
socket.emit('doesOtherSocketAgree', otherSocketId, (answer) => {
resolve(answer);
});      
});
}

https://socket.io/docs/#Sending-and-getting-data-acknowledgements

因此,您可以使用单个emit()并可以触发回调。 这样做的好处是,您不必在每次调用此函数时都处理注册事件侦听器的内存泄漏。

是的,但不是那样的。您必须将内容包装在一个承诺中,以便在数据作为"开始"处理的一部分进入时,您就可以从await中"返回":

async function doesSocketAgree(){
socket.emit('doesOtherSocketAgree', otherSocketId);
await new Promise(resolve => {
socket.on('responseDoesSocketAgree', answer => {
resolve(answer);
});
});
}

您可能希望在调用resolve()之前删除该侦听器,以便它不会继续触发,因为每次调用doesSocketAgree()时,您都会将一个新的侦听器添加到"on:responseSocketAgree"堆中。因此,如果不进行清理,最终很快就会出错。

在这一点上,你可能希望使用一个随机令牌发出你的"它是否同意?",你的on处理程序可以验证该令牌的作用域为当前函数调用,"因为异步"。

最新更新