最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin16浏览0评论

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

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

handupCards是使用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));
}
发布评论

评论列表(0)

  1. 暂无评论