sdg*_*sdg 12 node.js express 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 });
});
});
Run Code Online (Sandbox Code Playgroud)
客户:
<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>
Run Code Online (Sandbox Code Playgroud)
当我第一次单击test me按钮时,socket.emit('result',{hello:'world'}); 它被发射一次.在控制台中我得到了这个印刷品:
console.log('The data is '+data)
Run Code Online (Sandbox Code Playgroud)
但是当我再次点击时,我打印了三次:
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
Run Code Online (Sandbox Code Playgroud)
当我第三次点击时,我会打印六次:
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)
Run Code Online (Sandbox Code Playgroud)
像这样,它正在成倍增长.
任何人都可以给我一些如何解决这个问题的见解.非常感谢您的帮助.谢谢!
ces*_*uis 15
我想你正在为每次打电话的"结果"添加越来越多的听众.
首次单击 - >从调用1侦听器调用1 console.log
第二次单击 - >从调用1监听器调用1 console.log +从调用1监听器调用2 console.log从调用2监听器调用2 console.log
第三次 - >以前的日志+从调用1监听器调用3 console.log +从调用2监听器调用3 console.log并从调用3监听器调用3 console.log.
尝试将"结果"的监听器放在函数之外:
<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>
Run Code Online (Sandbox Code Playgroud)
小智 15
对于客户端,您可以使用socket.once()代替socket.on(). 例子:
socket.once('result', function(data){
console.log('The data is '+data)
})
Run Code Online (Sandbox Code Playgroud)
参考:https : //socket.io/docs/v3/listening-to-events/#socket-once-eventName-listener
| 归档时间: |
|
| 查看次数: |
9563 次 |
| 最近记录: |