1
私はSocket.ioで簡単なチャットルームを構築しています。ユーザは所望のユーザ名を入力し、フォームを送信する。私のSocket.ioイベントが何回も起動しているのはなぜですか?
私はチャットに現在あるユーザーごとに発射しているようで、ユーザ名が使用されているかどうかをチェックして、ユーザ名が利用可能な場合join
イベントを発生、チャットに追加されますが、join
イベント - ありません新しいユーザーがそれを入力するたびに1回。
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);
ラインは、最初の人が正しいフォームを送信する際に一度起動するように思えます。しかし、2人目がフォームを送信すると、join
イベントが2回発生します。第三者がフォームを提出すると、3回発砲します。ユーザーごとにイベントが発生するのはなぜですか?フォーム提出ごとに発射すればいいのですか?
サーバー
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'でイベントを発行すると、サーバーに接続されているすべてのユーザーに対してイベントが発生します。 –
大きなキャッチ。私はsocket.ioを初めて使っていて気付かなかった。私はその例を別の関数からコピーして、誰にもそのイベントを出しました。とにかく、スイッチを作ることはやりました。ありがとう! –