gpt4 book ai didi

javascript - 为什么我的 Socket.io 事件会多次触发?

转载 作者:行者123 更新时间:2023-11-30 15:14:36 26 4
gpt4 key购买 nike

我正在使用 Socket.io 构建一个简单的聊天室。用户输入所需的用户名并提交表单。

我检查用户名是否在使用中,如果用户名可用,则触发 join 事件,这会将他们添加到聊天中,但 join 事件似乎为当前在聊天中的每个用户触发 - 而不是为进入聊天的新用户触发一次。

客户端

var socket = io();

// user enters desired username and submits form
$('#chat__join').on('submit', function() {

// get username value
var name = $('#chat__name').val();

// send socket username to check if someone is already using it
socket.emit('isUserInChat', name);

return false;
});

// callback for when we know if user is already in chat or not
socket.on('isUserInChat', function(exists, name) {

if(!exists) {

// this only fires once per form submission
console.log('username is available');

// but this fires per user
socket.emit("join", name);
} else {
// username is taken
// display error message
}
});

socket.emit("join", name); 行似乎在第一个人提交表单时触发一次,这是正确的。但是当第二个人提交表单时,join 事件会被触发两次。当第三人提交表单时,它会被触发三次。为什么每个用户都会触发事件?它不应该只在每次提交表单时触发吗?

服务器

var express = require('express'),
app = express(),
http = require('http').Server(app),
io = require('socket.io')(http),
usersObj = {
users: []
};

io.on('connection', function(socket) {

socket.on('isUserInChat', function(username) {

var flag = false;

// for each user
for(var i = 0; i < usersObj.users.length; i++) {

// if username matches username that was entered
if(usersObj.users[i].username == username) {

// set flag to be true
flag = true;
}
}

// send client true or false
io.emit('isUserInChat', flag, username);
});

socket.on('join', function(name) {

// construct user
var user = {
id: socket.id,
username: name
};

// add user to users object array
usersObj.users.push(user);

// send chat message
io.emit('sendMsg', 'Chat Bot', name+' has connected to the server.');
});
});

最佳答案

你看起来很困惑,但你实际上告诉事件要发送给每个客户。如果您希望它只回显给正在检查可用性的客户端

io.emit('isUserInChat', flag, username);

应该是

socket.emit('isUserInChat', flag, username);

关于javascript - 为什么我的 Socket.io 事件会多次触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44661841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com