JavaScript - objects liefetime
JavaScript - objects liefetime
我正在尝试使用socket.io创建一个node.js服务器。目前只是概念验证。我创建了两个文件,第一个用于服务器,另一个用于服务器端用户。
服务器核心.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');
服务器用户.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#客户端可以很好地连接到服务器,但当用户服务器试图发回答案时,ServerUser.prototype.auth
方法中的this.socket
是未定义的。这告诉我,我在服务器核心中创建的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));
相关文章:
- creating objects from variables ES6
- Javascript Objects?
- JSON and javascript objects
- Angularjs orderby objects keys
- ExtJs 5.0:forEach on Array of Objects在IE8中不起作用
- JavaScript - objects liefetime
- Facebook JSON empty objects
- JavaScript - Objects Id
- MVC 3 jquery ajax post 2 objects
- document.execCommand('copy') on objects not in DOM?
- Table of objects - uniq
- Javascript - 检查 Amazon Objects 以查看是否定义
- jQuery.extend() deep clone nested objects
- JavaScript - ui-select and objects
- NodeJS&Gulp Streams&Vinyl File Objects-用于NPM包的Gulp W
- Javascript: ForEach over sub objects
- LocalStorage, JavaScript and Objects
- Javascript shift() for Objects
- jQuery, JSON objects and .NET WebServices
- Javascript Objects and the DOM