Socket.io испускает несколько раз
У меня есть очень простой пример. Этот вопрос задавался ранее несколько раз в переполнении стека, но я не мог получить правильный ответ, поэтому я перейду к этому базовому примеру.
Сервер:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(3000);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
socket.on('chat', function (data) {
var op = false;
if( data.id == '1234' ){
op = 'yes';
}else{
op = 'no';
}
socket.emit('result', { hello: op });
});
});
Клиент:
<html>
<body>
<button onclick="check()">Test Me :-)</button>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000');
var check = function(){
var data = { id : '234'};
socket.emit('chat', data);
socket.on('result', function(data){
console.log('The data is '+data)
})
}
</script>
</body>
</html>
Когда я нажимаю кнопку "Проверить меня" в первый раз
socket.emit('result', {hello: 'world'});
он излучается один раз. И в консоли я получаю эту печать:
console.log('The data is '+data)
Но когда я нажимаю еще раз, я печатаю три раза:
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
Когда я нажимаю на третий раз, я печатаю шесть раз:
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
Подобным образом он умножается и уходит.
Кто-нибудь, пожалуйста, дайте мне понять, как решить эту проблему.
Ваша помощь очень ценится. Спасибо!
Ответы
Ответ 1
Я думаю, что вы добавляете все больше и больше слушателей к "результату" каждого звонка, который вы делаете для проверки.
Первый клик → вызов 1 console.log из вызова 1 прослушиватель
Второй клик → вызов 1 console.log из вызова 1 прослушиватель + вызов 2 console.log из вызова 1 прослушиватель + вызов 2 console.log из вызова 2 прослушивателя
Третий раз → Предыдущие журналы + вызов 3 console.log из вызова 1 прослушиватель + вызов 3 console.log из вызова 2 слушателя и вызов 3 console.log из прослушивателя 3-го вызова.
Попробуйте вывести слушателя из "результата" из функции:
<html>
<body>
<button onclick="check()">Test Me :-)</button>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000');
socket.on('result', function(data){
console.log('The data is '+data)
})
var check = function(){
var data = { id : '234'};
socket.emit('chat', data);
}
</script>
</body>
</html>