Javascript 是否可以使用socket.io等待socket.on(';answerToRequest';)?
以下是可能的吗Javascript 是否可以使用socket.io等待socket.on(';answerToRequest';)?,javascript,node.js,websocket,socket.io,backend,Javascript,Node.js,Websocket,Socket.io,Backend,以下是可能的吗 async function doesSocketAgree(){ socket.emit('doesOtherSocketAgree', otherSocketId); await socket.on('responseDoesSocketAgree', (answer)=>{ console.log('answer'); }); } 是的,但不是那样。您必须将事情包装在承诺中,以便在数据作为“打开”处理的一部分进入时,您可以从等待中“返回”
async function doesSocketAgree(){
socket.emit('doesOtherSocketAgree', otherSocketId);
await socket.on('responseDoesSocketAgree', (answer)=>{
console.log('answer');
});
}
是的,但不是那样。您必须将事情包装在承诺中,以便在数据作为“打开”处理的一部分进入时,您可以从
等待中“返回”:
async函数doesSocketAgree(){
emit('doesOtherSocketAgree',otherSocketId);
等待新的承诺(解决=>{
socket.on('responsedessocketagree',answer=>{
决心(回答);
});
});
}
您可能希望在调用resolve()
之前删除该侦听器,这样它就不会继续触发,因为每次调用doesocketree()
时,您都会将一个新的侦听器添加到“on:responsesocketree”堆中。因此,如果不进行清理,很快就会出问题
在这一点上,您可能希望使用一个随机标记来发出“Doit agree?”,您的On
处理程序可以验证该标记是否属于当前函数调用的范围,“因为async”。它是,但不是那样。您必须将事情包装在承诺中,以便在数据作为“打开”处理的一部分进入时,您可以从等待中“返回”:
async函数doesSocketAgree(){
emit('doesOtherSocketAgree',otherSocketId);
等待新的承诺(解决=>{
socket.on('responsedessocketagree',answer=>{
决心(回答);
});
});
}
您可能希望在调用resolve()
之前删除该侦听器,这样它就不会继续触发,因为每次调用doesocketree()
时,您都会将一个新的侦听器添加到“on:responsesocketree”堆中。因此,如果不进行清理,很快就会出问题
在这一点上,您可能希望使用一个随机令牌发出“Doit agree?”,您的On
处理程序可以验证该令牌是否属于当前函数调用的范围,“因为异步”。在socket.io中,您可以使用“确认”回调:
async函数doesSocketAgree(){
等待新的承诺(解决=>{
emit('doesOtherSocketAgree',otherSocketId,(答案)=>{
决心(回答);
});
});
}
在socket.io中,您可以使用“确认”回调:
async函数doesSocketAgree(){
等待新的承诺(解决=>{
emit('doesOtherSocketAgree',otherSocketId,(答案)=>{
决心(回答);
});
});
}
或者他可以/应该使用“确认”回调:您需要在事件侦听器启动后删除它,否则它会累积。对,因此:如前所述,在调用resolve
之前。但是Marc的解决方案更好。或者他可以/应该使用“确认”回调:您需要在事件侦听器启动后删除它,否则它会累积。对,所以:如前所述,在调用resolve
之前。但是Marc的解决方案更好。这可能是最好的方法。这可能是最好的方法。