Показать сообщение отдельно
  #15 (permalink)  
Старый 18.09.2018, 14:23
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

SuperZen, радость была преждевременной)))))))))))))))

Дабы исключить ошибку соединения сокета, я перед созданием экземпляра, пульнул ajax на сервер, и если он мне вернул код 200 то все ок, создаем и вешаем слушатели open и close. по событию close просто снова вызываем connection. Вот код:

'use strict';
window.SocketModule = (function(window) {
        
    class SocketModule {
        
        constructor(options) {
            
            this.socket;
            this.path = options.path;
            this.connection();
            this.reconnectCount = 60;
            
        }
        
        connection() {
            
            const _t = this;
            
            this.checkServer(function(server) {
                
                if (!server) return;
                
                _t.socket = new WebSocket(_t.path);
                
                _t.socket.addEventListener('open', function() {

                    _t.indicatorControl(true);

                });
                
                _t.socket.addEventListener('close', function() {
                    
                    _t.indicatorControl(false);

                    _t.connection();

                });
                
            });
            
            return this;

        }
        
        checkServer(callback) {
            
            let timer;
            const _t = this;
            let count = 0;
            
            timer = setInterval(function() {
                
                const req = new XMLHttpRequest();
            
                req.open('GET', '/api/connect', true);
                req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                
                req.send(null);

                req.addEventListener('load', function() {
                    
                    if (req.status === 200) {
                        
                        clearInterval(timer);
                        
                        callback(true);
                        
                    }

                });
                
                count++;
                
                if (count === _t.reconnectCount) {
                    
                    clearInterval(timer);
                    
                    console.log('Превышен лимит ожидания!');
                    
                }
                
            }, 200);
            
            return this;
                        
        }
        
        sendMessage(event_name, data) {

            if (event_name.constructor.name === 'String') {
                
                const _t = this;
                
//                this.readyStateConnection(function() {
                
                    _t.socket.send(JSON.stringify({event_name, data}));

//                });
                
            } else return;
            
            return this;
            
        }
        
        readyStateConnection(callback) {
            
            let timer;
            clearTimeout(timer);
            
            if (this.socket.readyState === 1) {
                
                callback();
                
            } else {
                
                const _t = this;
                timer = setTimeout(function() {
                    
                    _t.readyStateConnection(callback);
                    
                }, 0);
            }
        }
    
    };
    
    return SocketModule;

})(window);


НО!!!!!!!!!!!!!!!!!!!!!!!!!))))))))))))))))))))) )

Когда я вызываю метод sendMessage в другом классе:

'use strict';
window.Chat = (function(window) {
    
    const options = window.options;
    const socketModule = window.SocketModule;
    const ServiceModule = window.ServiceModule;
    const MessageModule = window.MessageModule;
    
    class Chat {
        
        constructor() {
            
            this.transport = new socketModule({
                
                path: options.socketPath
                
            });
            
        }
        
        init() {
            
            this.transport.sendMessage('chat_message', {
                
                type: 'text',
                text: 'Lorem ipsum dolor sit amet, megatron7000'
            
            });
            
            
            
        }
        
    }
    
    return Chat;
    
})(window);


Эта шайтан машина))) выдает мне - annot read property 'send' of undefined! В методе readyStateConnection this.socket = undefined!!!! если вывести в консоль this, то он есть, а если this.socket его нет.
Ответить с цитированием