Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确使用socket.io和oop_Javascript_Node.js_Oop_Socket.io - Fatal编程技术网

Javascript 如何正确使用socket.io和oop

Javascript 如何正确使用socket.io和oop,javascript,node.js,oop,socket.io,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()

我喜欢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开发人员,我意识到我的想法有所不同。提前谢谢

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

Javascript是一种有趣的语言,
这是乐趣的一部分()

您可以通过执行以下操作来解决此问题:

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--;
       });
}
请看我从刚才引用的博客文章中复制的示例:

它返回五,因为count在闭包函数中作为外部变量引用。但是如果在增量闭包内的计数之前添加
这个。
,结果将是四。这与您的
This
不引用Y的原因完全相同