Javascript 如何将socket.io与mootools集成

Javascript 如何将socket.io与mootools集成,javascript,socket.io,mootools,Javascript,Socket.io,Mootools,我有一个关于mootools和socket.io在客户端上的集成的问题: 假设: -在node.js中开发的服务器应用程序具有socket.io侦听 我想定义一个类来管理与服务器的连接,client socket.io必须驻留在这个类中 实际上,我可以从这个类发送连接,但我不能管理推送事件。如何更正此代码 var Push = new Class({ Implements: [Events], initialize : function() { this.s

我有一个关于mootools和socket.io在客户端上的集成的问题:

假设: -在node.js中开发的服务器应用程序具有socket.io侦听

我想定义一个类来管理与服务器的连接,client socket.io必须驻留在这个类中

实际上,我可以从这个类发送连接,但我不能管理推送事件。如何更正此代码

var Push = new Class({ 

    Implements: [Events], 
    initialize : function() {
        this.socketServer = '192.168.1.3';
        this.listeningPort = '8080';
        this.socketIoUrl = 'http://'.concat(this.socketServer,':', this.listeningPort);

        // 
        this.socketIO = io.connect(this.socketIoUrl, {
            'connect timeout' : 500,
            'reconnect' : false,
            'reconnection delay' : 0,
            'reopen delay' : 500,
            'max reconnection attempts' : 0
        });

        // Attach Socket.io events
        this.attachEvents();

        // Creating a socket.io room
        this.socketIO.emit('create', this.filterName);
    },

    // SOCKET.IO EVENTS
    attachEvents : function() {
        socketIO.on = function(e) {
            log.info('aaa');
            socket.on('disconnect', function() {
                log.error("SOCKET.IO CLIENT disconnected");
                this.fireEvent("disconnect", [ e.data, e ]);
            });

            socket.on('connect_failed', function() {
                log.error("SOCKET.IO connection failed ");
                this.fireEvent("connect_failed", [ e.data, e ]);
            });

            socket.on('message', function() {
                log.debug(e.data);
                processMessage(e.data); 
                this.fireEvent("message", [ e.data, e ]);
            });

        }.bind(this)

        return this
    }

});
您似乎已经丢失了Push类实例的上下文

要解决此问题,您需要修改attachEvents函数,如下所示:

// SOCKET.IO EVENTS
attachEvents : function() {
    var self = this; // save context to variable called "self"

    this.socketIO.on('disconnect', function() {
        log.error("SOCKET.IO CLIENT disconnected");
        self.fireEvent("disconnect", [ e.data, e ]);
    });

    this.socketIO.on('connect_failed', function() {
        log.error("SOCKET.IO connection failed ");
        self.fireEvent("connect_failed", [ e.data, e ]);
    });

    this.socketIO.on('message', function() {
        log.debug(e.data);
        processMessage(e.data); 
        self.fireEvent("message", [ e.data, e ]);
    });

    return this;
}
您似乎已经丢失了Push类实例的上下文

要解决此问题,您需要修改attachEvents函数,如下所示:

// SOCKET.IO EVENTS
attachEvents : function() {
    var self = this; // save context to variable called "self"

    this.socketIO.on('disconnect', function() {
        log.error("SOCKET.IO CLIENT disconnected");
        self.fireEvent("disconnect", [ e.data, e ]);
    });

    this.socketIO.on('connect_failed', function() {
        log.error("SOCKET.IO connection failed ");
        self.fireEvent("connect_failed", [ e.data, e ]);
    });

    this.socketIO.on('message', function() {
        log.debug(e.data);
        processMessage(e.data); 
        self.fireEvent("message", [ e.data, e ]);
    });

    return this;
}
现在它起作用了

必须在initialize调用的特定方法中定义Socket.io init。初始化中的直接初始化无效:

initialize : function(filterName, instrumentCode, fieldList, bankName, userName) {
    var self = this;

    ....
    self.initConnection();
    self.attachEvents();
},

initConnection : function() {
    var self = this;

    self.socketIO = io.connect(this.socketIoUrl, {
        'connect timeout' : 500,
        'reconnect' : true,
        'reconnection delay' : 0,
        'reopen delay' : 500,
        'max reconnection attempts' : 0
    });

    logger.debug ('socket.io init');
},

attachEvents : function() {
    var self = this;

    // Attach Socket.io events
    //this.attachEvents();
    self.socketIO.on('disconnect', function() {
        logger.error('Client disconnected');
        self.initConnection();
        self.resendRequest();
    });

    self.socketIO.on('connect_failed', function() {
        logger.error('Connection failed');
        self.initConnection();
        self.resendRequest();
    });

    self.socketIO.on('message', function(data) {
        self.processMessage(data);
    });

    self.socketIO.emit('create', this.filterName);
},

resendRequest : function() {
    if (this.operationType == "SUBSCRIBE") {
        subscribe();
    } else {
        unsubscribe();
    }
},
谢谢大家。

现在它可以工作了

必须在initialize调用的特定方法中定义Socket.io init。初始化中的直接初始化无效:

initialize : function(filterName, instrumentCode, fieldList, bankName, userName) {
    var self = this;

    ....
    self.initConnection();
    self.attachEvents();
},

initConnection : function() {
    var self = this;

    self.socketIO = io.connect(this.socketIoUrl, {
        'connect timeout' : 500,
        'reconnect' : true,
        'reconnection delay' : 0,
        'reopen delay' : 500,
        'max reconnection attempts' : 0
    });

    logger.debug ('socket.io init');
},

attachEvents : function() {
    var self = this;

    // Attach Socket.io events
    //this.attachEvents();
    self.socketIO.on('disconnect', function() {
        logger.error('Client disconnected');
        self.initConnection();
        self.resendRequest();
    });

    self.socketIO.on('connect_failed', function() {
        logger.error('Connection failed');
        self.initConnection();
        self.resendRequest();
    });

    self.socketIO.on('message', function(data) {
        self.processMessage(data);
    });

    self.socketIO.emit('create', this.filterName);
},

resendRequest : function() {
    if (this.operationType == "SUBSCRIBE") {
        subscribe();
    } else {
        unsubscribe();
    }
},

谢谢大家。

即使是使用var f=this.firevent;,您也会感觉更好。。。f'message',e.data,e等。为了避免查找属性,因为您不引用任何其他属性,我发现了另一个问题:在初始化中无法直接调用io.connect,否则,连接无法工作…我认为socket.io可以在您想要的任何时间初始化。为什么不能在Push类的构造函数中调用它?我不知道为什么,但如果我在其他方法中移动io.connectthis.socketIoUrl并调用它,一切都正常。您最好甚至执行var f=this.fireEvent。。。f'message',e.data,e等。为了避免查找属性,因为您不引用任何其他属性,我发现了另一个问题:在初始化中无法直接调用io.connect,否则,连接无法工作…我认为socket.io可以在您想要的任何时间初始化。为什么不能在Push类的构造函数中调用它?我不知道为什么,但是如果我在其他方法中移动io.connectthis.socketIoUrl并调用它,一切都可以。下次我会更加注意引入更多元素。谢谢。下次我会更加注意带来更多的元素。非常感谢。