Socket.IO's一旦功能不能正常工作
Socket.IO's once function not working correctly
我的目的是使用Node.js + Socket制作一个聊天应用程序。但是我遇到了一个困难。问题是,minus
事件不能正常工作(结果:64 - 12 = 65),但plus
事件工作正常(结果:42 + 23 = 65)。可能问题的原因与socket.once()
功能有关…但是我不清楚答案。
下面是我简化后的Node.js应用程序的源代码。
app.js:
var http = require('http');
var fs = require('fs');
var socketio = require('socket.io');
var app = http.createServer(function (req, res) {
if (req.url === '/') {
fs.readFile(__dirname + '/index.html', function (err, result) {
if (err)
throw err;
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(result);
});
} else {
res.writeHead(404);
res.end();
}
});
app.listen(3000, function () {
console.log('The server running on port 3000.');
});
var io = socketio(app);
io.on('connection', function (socket) {
socket.on('plus', function (param) {
socket.emit('result', param.a + param.b);
});
socket.on('minus', function (param) {
socket.emit('result', param.a - param.b);
});
});
index . html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title></title>
<script src="http://cdn.socket.io/socket.io-1.0.6.js"></script>
<script>
var socket = io();
socket.emit('plus', {
a: 42,
b: 23
});
socket.once('result', function (result) {
var div = document.createElement('div');
div.innerText = '42 + 23 = ' + result;
document.body.appendChild(div);
});
socket.emit('minus', {
a: 64,
b: 12
});
socket.once('result', function (result) {
var div = document.createElement('div');
div.innerText = '64 - 12 = ' + result;
document.body.appendChild(div);
});
</script>
</head>
<body>
</body>
</html>
结果:42 + 23 = 65
64 - 12 = 65
谢谢。
因为你在'result'上同时绑定了两个事件回调。
<script>
var socket = io();
socket.emit('plus', {
a: 42,
b: 23
});
socket.once('result', function (result,obj) {
var div = document.createElement('div');
div.innerText = '42 + 23 = ' + result;
document.body.appendChild(div);
socket.emit('minus', {
a: 64,
b: 12
});
socket.once('result', function (result,obj) {
var div = document.createElement('div');
div.innerText = '64 - 12 = ' + result;
document.body.appendChild(div);
});
});
</script>
你不能像那样重载"once"结果——它们都是立即绑定的,而不是同步绑定的。正确的做法是为不同类型的结果使用两个单独的事件。
这是修改后的app.js
var http = require('http');
var fs = require('fs');
var socketio = require('socket.io');
var app = http.createServer(function (req, res) {
if (req.url === '/') {
fs.readFile(__dirname + '/index.html', function (err, result) {
if (err)
throw err;
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(result);
});
} else {
res.writeHead(404);
res.end();
}
});
app.listen(3000, function () {
console.log('The server running on port 3000.');
});
var io = socketio(app);
io.on('connection', function (socket) {
socket.on('plus', function (param) {
socket.emit('plus result', param.a + param.b);
});
socket.on('minus', function (param) {
socket.emit('minus result', param.a - param.b);
});
});
以及相应的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title></title>
<script src="http://cdn.socket.io/socket.io-1.0.6.js"></script>
<script>
var socket = io();
socket.on('plus result', function (result) {
var div = document.createElement('div');
div.innerText = '42 + 23 = ' + result;
document.body.appendChild(div);
});
socket.once('minus result', function (result) {
var div = document.createElement('div');
div.innerText = '64 - 12 = ' + result;
document.body.appendChild(div);
});
socket.emit('plus', {
a: 42,
b: 23
});
socket.emit('minus', {
a: 64,
b: 12
});
</script>
</head>
<body>
</body>
</html>
相关文章:
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JS可以在Chrome中工作,但不能在Firefox中工作
- javascript扫雷器floodfill算法不能正常工作
- JavaScript指令不能像我想象的那样工作
- 变量只能在函数中局部工作,不能全局工作-Javascript
- 我能不能早点用蓝鸟承诺打破链条
- 骨干.js我们能不能没有任何标签名称
- 我能不能早点结束一个承诺
- 你能不能让 mongo 默认生成_ids字符串
- 我能不能定义一个方法,给它一个值,并在对象文字中分配其他方法
- 我能不能把我的javascript文件放在html公共文件夹外?
- 能不能确定这个窗口.resizeTo将工作
- 能不能帮我解释一下这个Javascript (angularjs代码)具体的“this”?
- Zepto's clone()函数不能正常工作或不能将clone()与find()结合使用
- 脚本只能在RWD主题中工作,不能在默认主题上工作
- 为什么相同的代码在另一种形式下可以工作而不能工作
- . getelementbyid工作但不能.getelementbyid ().value
- D3js退出()和更新工作,不能进入()
- QuickBlox& # 39;addlistener只是偶尔工作,不能告诉为什么或什么触发它