如何正确使用socket.io和oop

时间:2014-02-13 13:15:25

标签: javascript node.js oop socket.io

我喜欢node.js和socket.io,因为它们非常强大而美丽,但是我的开发几乎没有什么问题阻止我。这可能是因为我没有足够的练习与node.js一起使用javascript。

问题: 有一个代码:

var express = require('express');
var sio = require('socket.io');
var X = require('./js/x.js');
var Y = require('./js/Y.js');

var app = express.createServer();
var ws = sio.listen(app);
var users = [];

app.use(express.static(__dirname + '/public'));

ws.sockets.on('connection', function(socket) {
    users.push(new X(socket));
    if (users.length === 2) {
        var z = new Y(users.shift(), users.shift());
        z.listen();
    }

  });

app.listen(9000);

这是X和Y:

module.exports = function X(socket) {

    this.socket = socket;
    this.name = '';

    X.prototype.setName = function(name) {
        this.name = name;
    };
};

module.exports = function Y(a, b) {
    this.a1 = a;
    this.a2 = b;
    this.variable1 = 777;

    Y.prototype.listen = function() {
        this.a1.socket.on('text', function(msg) {
            console.log('a1: ' + msg);
            // AND HERE IS MY ISSUE:
            // I want to access a2 by 'this' but 'this' doesn't point on 'class' Y
            this.a2.socket.emit('text', 'a1: ' + msg);
            // Also i want to change value of variable, something like that:
            this.a1.setName(msg);
            // AND:
            this.variable1--;
        });

    };

我的问题是:如何以及我做错了什么。我是PHP开发人员,我知道我的想法有所不同。提前谢谢!

1 个答案:

答案 0 :(得分:0)

由于你的回调函数不是Y this的方法,因此不会引用Y.

Javascript是一种有趣的语言,this是乐趣的一部分(http://bonsaiden.github.io/JavaScript-Garden/#function.this)。

您可以通过以下方式解决此问题:

Y.prototype.listen = function() {
  var that = this;
  this.a1.socket.on('text', function(msg) {
           console.log('a1: ' + msg);
           that.a2.socket.emit('text', 'a1: ' + msg);
           that.a1.setName(msg);
           that.variable1--;
       });
}

看看我刚刚引用的博客文章中复制的这个例子:

http://jsfiddle.net/UuHgh/

它返回5,因为count在闭包函数中被引用为外部变量。但是如果在增量闭包内的count之前添加this.,结果将为4。这正是出于this未引用Y的原因。