2013-10-04 54 views
1

我正在研究一个在线的,基于转向的游戏,以便自学Node.js和Socket.IO。服务器端解决了游戏的某些方面。在其中一个功能期间,服务器可能需要来自客户端的输入。有没有办法可以“暂停”服务器功能的分辨率,以便等待客户端进行响应(通过var x = window.prompt)?如何用socket.io等待客户端响应?

这里是我的工作代码的一个想法:

服务器:

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) 
}); 

有什么想法?

+0

“暂停解析”是什么意思? – hexacyanide

+0

也许“等待”会是更好的词。我希望服务器的功能在继续循环之前等待来自客户端的输入。 – Cole

+0

@Cole你不能暂停执行。你可以做的是将用户输入后应该执行的所有内容移动到另一个函数中,并在用户响应时调用它。 – fardjad

回答

0

我不认为这是可能的。

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得到(“刷新”,函数(){})事件一个数组,那么你可以稍后处理这个数组。我不知道你的具体要求是什么,但让我知道这是否有效。

0

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

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

我也会指出,这样你不会遇到麻烦,那个无限循环是节点中的一个大nono。 Nodejs在一个线程上运行,所以只要你的循环正在运行,你实际上阻止了所有的客户端。

+0

啊,很高兴知道 - 尤其是那些循环。我想我意识到我对解决方法的渴望是服务器端函数中一些糟糕设计的特点,我应该做一些重构。 – Cole