如何使用 socket.io 等待客户端响应

How to wait for client response with socket.io?

本文关键字:客户端 响应 等待 io 何使用 socket      更新时间:2023-09-26

我正在开发一个在线的回合制游戏,以便自学Node.js和 Socket.IO。 游戏的某些方面在服务器端得到解决。 在其中一个函数期间,服务器可能需要来自客户端的输入。 有没有办法"暂停"服务器功能的解析以等待客户端响应(通过var x = window.prompt)?

以下是我正在使用的代码的一个想法:

服务器:

for (some loop){
  if (some condition){
   request input via io.sockets.socket(userSocket[i]).emit('requestInput', data)  
  }
}

客户:

socket.on('requestInput', function (data) {
  var input = window.prompt('What is your input regarding ' + data + '?');
  //send input back to the server
  socket.emit('refresh', input)  
});

有什么想法吗?

我认为这是不可能的。

for (some loop){
    if (some condition){
    request input via io.sockets.socket(userSocket[i]).emit('requestInput', data) 
    /* Even if you were able to pause the execution here, there is no way to resume   it when client emits the 'refresh' event with user input */
}

}

相反,您可以做的是在不暂停的情况下发出所有"requestInput"事件,并将您在socket.on('refresh',function(){})事件中获得的所有响应保存在数组中,然后您可以稍后处理此数组。我不知道您的确切要求是什么,但请告诉我是否有效。

由于您在客户端发出socket.emit('refresh', input),因此您只需要在服务器端设置一个套接字事件侦听器。例如:

io.sockets.on('connection', function (socket) {
  socket.on('refresh', function (data) {
    console.log(data) //input
  });
})

我还要指出,为了您不会遇到麻烦,无限循环是节点中的一个大名号。Nodejs 在单个线程上运行,因此只要循环正在运行,您实际上就会阻止所有客户端。