Javascript Node.js和socket.io,客户端不共享计数器

Javascript Node.js和socket.io,客户端不共享计数器,javascript,node.js,scope,socket.io,Javascript,Node.js,Scope,Socket.io,我正在玩node.js和socket.io,试图让一个计数程序工作。基本上,它应该在连接的客户端每次按下按钮时将共享计数器增加1,并向所有连接的客户端显示该数字 我得到的是每个客户都有一个独立的柜台。例如,如果我在一个客户机上数到10,然后在另一个客户机上开始数数,它从1开始。如果我返回,第一个客户端将从10恢复。我试着尽我所能解决这个问题,但是当涉及到JS范围问题(我怀疑这是)或套接字时,我不是太精明 var socketio = require('socket.io'); var io; v

我正在玩node.js和socket.io,试图让一个计数程序工作。基本上,它应该在连接的客户端每次按下按钮时将共享计数器增加1,并向所有连接的客户端显示该数字

我得到的是每个客户都有一个独立的柜台。例如,如果我在一个客户机上数到10,然后在另一个客户机上开始数数,它从1开始。如果我返回,第一个客户端将从10恢复。我试着尽我所能解决这个问题,但是当涉及到JS范围问题(我怀疑这是)或套接字时,我不是太精明

var socketio = require('socket.io');
var io;
var count = 1;

exports.listen = function(server){
    io = socketio.listen(server);
    io.set('log level', 1);

    io.sockets.on('connection', function (socket){
        joinRoom(socket, 'Lobby');
        count = handleCounter(socket, count);
    });
};

function handleCounter(socket, count){
    socket.on('endCount', function(){
        io.sockets.emit('endCount', {
            success: true,
            num: count
        });
            count++;
            console.log(count);
    });
    return count;
}

function joinRoom(socket, room){
    socket.join(room);
}
值得注意的是,我以前只是将handleCounter中的代码放入('connection')函数的
io.sockets.on中,但我想知道,当我尝试像上面的代码一样将其放在外部时,为什么它不起作用

非常感谢您的帮助。

简而言之,在connect上发送数据,并在单击按钮时将数据发送到所有客户端

客户端仅在从服务器收到消息时更新dom

我在您的代码中看到的最大问题是,您正在使计数的范围复杂化。它是模块范围,可以简单地使用,而无需传递

服务器:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server)
  , count = 0;

var port = 4000;

server.listen(port);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.set('log level', 1);

io.sockets.on('connection', function (socket) {
  console.log(count);
  socket.emit('count', count);
  socket.on('inc', function () {
    count++;
    console.log('inc', count);
    io.sockets.emit('count', count);
  });
});
客户

<!DOCTYPE html>
<meta charset='utf-8'>
<title>real time fun</title>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery.js"></script>

<script>
  $(function() {
    var socket = io.connect();

    socket.on('count', function (count) {
      $('#count').text(count);
    });

    $('button').click(function () {
      socket.emit('inc');
    });
  });
</script>
<div id='count'></div>
<button>inc</button>

实时娱乐
$(函数(){
var socket=io.connect();
socket.on('count',函数(count){
$('#count')。文本(count);
});
$(“按钮”)。单击(函数(){
socket.emit('inc');
});
});
股份有限公司

简而言之,在connect上发送数据,并在单击按钮时将数据发送到所有客户端

客户端仅在从服务器收到消息时更新dom

我在您的代码中看到的最大问题是,您正在使计数的范围复杂化。它是模块范围,可以简单地使用,而无需传递

服务器:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server)
  , count = 0;

var port = 4000;

server.listen(port);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.set('log level', 1);

io.sockets.on('connection', function (socket) {
  console.log(count);
  socket.emit('count', count);
  socket.on('inc', function () {
    count++;
    console.log('inc', count);
    io.sockets.emit('count', count);
  });
});
客户

<!DOCTYPE html>
<meta charset='utf-8'>
<title>real time fun</title>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery.js"></script>

<script>
  $(function() {
    var socket = io.connect();

    socket.on('count', function (count) {
      $('#count').text(count);
    });

    $('button').click(function () {
      socket.emit('inc');
    });
  });
</script>
<div id='count'></div>
<button>inc</button>

实时娱乐
$(函数(){
var socket=io.connect();
socket.on('count',函数(count){
$('#count')。文本(count);
});
$(“按钮”)。单击(函数(){
socket.emit('inc');
});
});
股份有限公司

您将在
handleCounter()
的末尾返回
count
,但它在异步函数中递增,因此在返回之前没有递增

您不必到处传递
count
,只需引用您在文件顶部声明的
count
变量,该变量在所有闭包中都可用。如果您只想在每次客户端连接时向客户端发送新的计数,那么您也不需要
endCount
侦听器和发射器

var socketio = require('socket.io');
var io;
var count = 1;

exports.listen = function(server){
    io = socketio.listen(server);
    io.set('log level', 1);

    io.sockets.on('connection', function (socket){
        joinRoom(socket, 'Lobby');
        handleCounter();
    });
};

function handleCounter(){
    count++;
    console.log(count);

    io.sockets.emit('count', {
        success: true,
        num: count
    });
}

function joinRoom(socket, room){
    socket.join(room);
}

handleCounter()
的末尾返回
count
,但在异步函数中它是递增的,因此在返回之前它没有递增

您不必到处传递
count
,只需引用您在文件顶部声明的
count
变量,该变量在所有闭包中都可用。如果您只想在每次客户端连接时向客户端发送新的计数,那么您也不需要
endCount
侦听器和发射器

var socketio = require('socket.io');
var io;
var count = 1;

exports.listen = function(server){
    io = socketio.listen(server);
    io.set('log level', 1);

    io.sockets.on('connection', function (socket){
        joinRoom(socket, 'Lobby');
        handleCounter();
    });
};

function handleCounter(){
    count++;
    console.log(count);

    io.sockets.emit('count', {
        success: true,
        num: count
    });
}

function joinRoom(socket, room){
    socket.join(room);
}

这就是你想要的效果?是 啊在大多数情况下,这就是我想要实现的。源头就在那里,等等。我还在处理socket.io版本的Anks,我会检查一下。尽管我仍然很好奇为什么我的代码不能正常运行。这就是你想要的效果吗?是 啊在大多数情况下,这就是我想要实现的。源头就在那里,等等。我还在处理socket.io版本的Anks,我会检查一下。虽然我仍然很好奇为什么我的代码不能正常运行。这是可行的,但我想我是想通过传递
count
来让事情变得过于复杂。事实上,我曾想过正常情况下只引用
count
变量,但我总是担心我没有按照“正确”的方式进行操作,从而偏离了编码切线。谢谢(我还在客户端的按键上增加计数器,所以这就是我使用endCount发射器和侦听器的目的)这很有效,我想我试图通过传递
count
使事情变得过于复杂。事实上,我曾想过正常情况下只引用
count
变量,但我总是担心我没有按照“正确”的方式进行操作,从而偏离了编码切线。谢谢(我还在客户端的按钮按钮上增加计数器,所以这就是我使用endCount发射器和侦听器的目的)