socket.io在for循环中使用socket.on执行函数

时间:2019-03-18 13:44:05

标签: javascript node.js socket.io

我有一些使用socket.io的在线多人游戏代码。有一次,客户端将数据发送到服务器,以接收和处理这些数据,我在for循环中有一个socket。

服务器:

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

handupCards是客户端使用socket.emit

发送的数组

最初,我的问题是由于没有使用回调函数来避免关闭问题,但是现在我添加了一个单独的callBack函数来解决此问题。

现在的问题是,当客户端发送'swapdone'信号时,callBack函数内部的代码未执行。我尝试过移动函数,但总是遇到闭包回调问题,或者函数无法执行。

我想念什么?

1 个答案:

答案 0 :(得分:0)

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