socket.io在for循环中使用socket.on来执行一个函数
我有一些使用socket.io
在线多人游戏的代码。有一次,客户端将数据发送到服务器,以接收和处理这个数据,我在for循环中有一个socket.on。
服务器:
function callBack(hand, upCards) {
return function() {
io.to('game_room').emit('log', 'callback');
players[i].socket.off('swapdone', runSwap);
players[i].swapped = true;
io.to('game_room').emit('log', 'call doswap');
doSwap(i, hand, upCards);
};
};
for (i = 0; i < players.length; i++ ){
players[i].socket.on('swapdone', function(hand, upCards) {
return callBack(i, hand, upCards);
});
};
hand
和upCards
是使用socket.emit
从客户端发送的数组
最初我的问题是由于没有使用回调函数来避免关闭问题,但是现在我添加了一个单独的callBack
函数来解决这个问题。
现在的问题是,当客户端发送'swapdone'
信号时,callBack
函数内的代码不会被执行。我试过移动函数但是我总是得到闭包回调问题,或者函数没有执行。
我错过了什么?
回答如下:callBack
有两个参数,你传递三个参数。 i
应该是该函数的第一个参数。此外,你必须正确声明i
:
for (let i = 0; i < players.length; i++ ){
此外,callBack
的内部功能是无用的,因为它什么都不做。只需删除它。
我该怎么做:
function callBack(i) {
return function(hand, upCards) {
io.to('game_room').emit('log', 'callback');
players[i].socket.off('swapdone', runSwap);
players[i].swapped = true;
io.to('game_room').emit('log', 'call doswap');
doSwap(i, hand, upCards);
};
}
for (let i = 0; i < players.length; i++ ){
players[i].socket.on('swapdone', callBack(i));
}