Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改setInterval中的发射套接字_Javascript_Node.js_Socket.io_Setinterval - Fatal编程技术网

Javascript 更改setInterval中的发射套接字

Javascript 更改setInterval中的发射套接字,javascript,node.js,socket.io,setinterval,Javascript,Node.js,Socket.io,Setinterval,从另一个处于倒计时(setInterval)的浏览器/选项卡发出套接字时出现问题 我有以下脚本 这段代码让我能够理解所有在平台上连接的人 server.js var nicks = new Array(); function usuarios(socket){ socket.emit('usuarios', {nicks: nicks}); socket.broadcast.emit('usuarios', {nicks: nicks}); } function nick(socket){

从另一个处于倒计时(setInterval)的浏览器/选项卡发出套接字时出现问题

我有以下脚本

这段代码让我能够理解所有在平台上连接的人

server.js

var nicks = new Array();

function usuarios(socket){
socket.emit('usuarios', {nicks: nicks});
socket.broadcast.emit('usuarios', {nicks: nicks});
}

function nick(socket){
socket.on('nick', function(data){

    var nick = data.nick;

    var variable =  nicks.filter(function(hero) {
        return hero.user == data.nick.user;
    });

    if(variable.length==0){ //Nuevo
        nicks.push(nick);
        socket.nick = nick;
        socket.emit('nick', {correcto: true, nick: nick});
        usuarios(socket);
    }else{//Existe

        socket.emit('nick', {update: true, nick: nick});

    }

})
}
    var timer;

    function myTimer(reset) {

        clearInterval(timer);

        timer = setInterval(function() {

            countdown--;

            var nick = {user: actualuser, time: countdown};
            socket.emit('nick', {nick: nick});

            if (countdown == 3000) { //Reset count.
                countdown=3600;
                var nick= {user: data, time: countdown};
                socket.emit('nick', {nick: nick});
            }
        }   , 1000);

    }

socket.on('nick', function(data){

});
front.js

var nicks = new Array();

function usuarios(socket){
socket.emit('usuarios', {nicks: nicks});
socket.broadcast.emit('usuarios', {nicks: nicks});
}

function nick(socket){
socket.on('nick', function(data){

    var nick = data.nick;

    var variable =  nicks.filter(function(hero) {
        return hero.user == data.nick.user;
    });

    if(variable.length==0){ //Nuevo
        nicks.push(nick);
        socket.nick = nick;
        socket.emit('nick', {correcto: true, nick: nick});
        usuarios(socket);
    }else{//Existe

        socket.emit('nick', {update: true, nick: nick});

    }

})
}
    var timer;

    function myTimer(reset) {

        clearInterval(timer);

        timer = setInterval(function() {

            countdown--;

            var nick = {user: actualuser, time: countdown};
            socket.emit('nick', {nick: nick});

            if (countdown == 3000) { //Reset count.
                countdown=3600;
                var nick= {user: data, time: countdown};
                socket.emit('nick', {nick: nick});
            }
        }   , 1000);

    }

socket.on('nick', function(data){

});
套接字将开始每1秒发出下一次计数

["nick",{"update":true,"nick":{"user":"1","time":3542}}]
所有这些都是可行的,但我现在遇到的问题是,如果一个人进入不同的浏览器,处理每个会话的倒计时不会重新启动,而是继续其过程。 范例

  • Chrome标签1:倒计时=3450
  • Chrome标签2:倒计时=3032
  • Chrome标签3:倒计时=3978
每次我更新选项卡(刷新)时,计数器都会重置为3600,但只有当前选项卡


当3000秒条件满足时,所有选项卡上的计数器都会重置

我不明白您到底需要什么

如果希望所有用户都保持相同的时间,则需要将interval函数放入server node.js中,并在需要时发出计时器重置,当连接新用户时,只需向其发送实际的倒计时

您可以收听新用户连接到:

io.on('connection', function (socket) {
  // where io = require('socket.io')(http),
})

是的,但是setinterval仅在浏览器会话中运行,并且以独占方式运行,如果我打开另一个选项卡或浏览器,它将运行完全不同的setinterval。我想做的是,如果用户进入的浏览器与当前浏览器不同,计数器将被全局重置(套接字)。每个连接的用户都有自己的计数器。