作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用socket.io 创建一个node.js 服务器。目前只是概念验证。我创建了 2 个文件,第一个用于服务器,另一个用于服务器端用户。
server-core.js
'use strict';
var io = require('socket.io').listen(4567);
var user = require('./server-user');
var users = [];
io.sockets.on('connection', function(socket){
var su = new user.ServerUser(socket);
users[socket.id] = su;
socket.on('auth', su.auth);
socket.on('disconnect', su.disconnect);
});
io.sockets.on('disconnect', function(socket){
console.log('disconnect');
users[socket.id].disconnect();
});
console.log('Server started');
server-user.js
var ServerUser = (function(){
function ServerUser(socket){
this.socket = socket;
console.log('serverUser-ctor ' + this.socket)
}
ServerUser.prototype.auth = function(data){
console.log('auth received\r\n' + data);
this.socket.emit('auth', {
Id: data.Id,
Timestamp: data.Timestamp,
StringField: data.StringField
});
}
ServerUser.prototype.disconnect = function(){
console.log('Client disconnected');
}
return ServerUser;
})();
module.exports = {
ServerUser: ServerUser
};
我的 C# 客户端可以很好地连接到服务器,但是当用户服务器尝试将答案发回时,this.socket
在 ServerUser.prototype.auth
方法中未定义。这告诉我,我在服务器核心中创建的 ServerUser 实例没有被保留,并且当调用“auth”方法时,实际上正在创建对象的新实例。
为了证明这一点,我替换了这一行
socket.on('auth', su.auth);
有这样的人
socket.on('auth', function(data){su.auth(data);});
之后它就按需要工作了。这是编写 JS 代码的正确方法吗?在编写大型 Node.js 应用程序时,是否有更好的方法将逻辑分离在单独的文件和类下?
感谢任何意见。
最佳答案
问题出在调用上下文。当您将 su.auth
传递给 socket.on()
时,this
不再引用 auth
内的 su
。因此,有几种方法可以解决这个问题。正如您所发现的,使用匿名函数就是其中之一。 Function.bind
是另一个:
socket.on('auth', su.auth.bind(su));
关于JavaScript - 对象liefetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600701/
我是一名优秀的程序员,十分优秀!