2014-02-13 19 views
2

我喜欢node.js和socket.io,因为它们强大而美丽,但是很少有问题阻止了我的发展。这可能是因为我没有足够的练习node.js JavaScript。如何正确使用socket.io和oop

问题: 有一个代码:

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开发人员,我意识到我思想上的差异。提前致谢!

回答

0

由于你的回调函数不是Ÿ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/

它返回五个,因为计数在闭包函数中被引用为外部变量。但是如果在计数增加闭合之前添加this.,结果将为四。这正是为什么你的this不参考Y.