2014-09-26 4 views
1

у меня есть вопрос о интеграции между MooTools и Socket.io на клиенте:Как интегрировать Socket.io с MooTools

Предположим: - серверное приложение, разработанных в Node.js, которые имеют Socket.io слушать

Я хочу определить класс для управления соединением с сервером, клиент socket.io должен находиться внутри этого класса.

На самом деле я могу отправить соединение из этого класса, но я не могу управлять событием push. Как исправить этот код?

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 
    } 

}); 

ответ

1

Теперь она работает.

Socket.io init должен быть определен в определенном методе, вызванном инициализацией. Прямая инициализация в nitialize не работает:

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(); 
    } 
}, 

Спасибо всем.

+4

Кажется, что ваша проблема не была вызвана socket.io или mootools ... – Inferpse

+0

В следующий раз я обращу больше внимания на то, чтобы принести много элементов. –

4

кажется, что вы потеряли 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; 
} 
+0

вам лучше даже выполнить 'var f = this.fireEvent; ... f ('message', e.data, e) 'и т. д., чтобы избежать поиска свойства, так как вы не ссылаетесь ни на какие другие –

+0

. Я обнаружил еще одну проблему: io.connect (не может быть вызван непосредственно при инициализации иначе, соединение не работает ... –

+1

Я думаю, что socket.io может быть инициализирован в любое время. Почему он не может быть вызван в конструкторе вашего класса 'Push'? – Inferpse

Смежные вопросы