Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以使用socket.io等待socket.on(';answerToRequest';)?_Javascript_Node.js_Websocket_Socket.io_Backend - Fatal编程技术网

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的解决方案更好。这可能是最好的方法。这可能是最好的方法。