关于socket.emit()的用法
我在《nodejs入门经典》看到一段代码 ##//HTML
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Socket.io Express Example</title>
</head>
<body>
<h1>Socket.io Express Example</h1>
<form id="set-nickname">
<label for="nickname">Nickname:</label>
<input type="text" id="nickname" />
<input type="submit" />
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
jQuery(function ($) {
var nickName = $('#nickname');
var setNicknameForm = $('#set-nickname');
setNicknameForm.submit(function(event) {
event.preventDefault();
socket.emit('nickname', nickName.val(), function (data) {
if (data) {
console.log('Nickname set successfully');
setNicknameForm.hide();
} else {
setNicknameForm.prepend('<p>Sorry - that nickname is already taken.');
}
});
});
});
</script>
</body>
</html>
##//app.js
var app = require('express').createServer(),
io = require('socket.io').listen(app),
nicknames = [];
app.listen(3000);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
socket.on('nickname', function (data, callback) {
if (nicknames.indexOf(data) != -1) {
callback(false);
} else {
callback(true);
nicknames.push(data);
socket.nickname = data;
console.log('Nicknames are ' + nicknames);
}
});
socket.on('disconnect', function () {
if (!socket.nickname) return;
if (nicknames.indexOf(socket.nickname) > -1) {
nicknames.splice(nicknames.indexOf(socket.nickname), 1);
}
console.log('Nicknames are ' + nicknames);
});
});
###在HTML中
socket.emit('nickname', nickName.val(), function (data) {
if (data) {
console.log('Nickname set successfully');
setNicknameForm.hide();
} else {
setNicknameForm.prepend('<p>Sorry - that nickname is already taken.');
}
第三个参数是不是向服务器传了一个参数?
###在app.js中
socket.on('nickname', function (data, callback) {
if (nicknames.indexOf(data) != -1) {
callback(false);
} else {
callback(true);
nicknames.push(data);
socket.nickname = data;
console.log('Nicknames are ' + nicknames);
}
给传进的函数给上参数,但是这个函数不是应该在服务器端执行的么? 为什么用的是DOM的方法,在客户端执行了呢? 这个callback是怎么回事?
4 回复
app.js中的callback(true)对应的就是html中的function (data),你可以把app.js中的callback(true)改为callback({name: ‘xiaoshan’}); html的function (data)中打印data.name,输出的就是xiaoshan
那为什么不把name这个参数传回去,而要在服务器调用这个函数呢?
@ggaaooppeenngg 这是个回调,至于是返回true或false,或者其他数据,完全由你控制。比如你需要在提交成功时返回一个只有服务端才能拿到的数据,那这个方法就很有用了