почему событие websocket «open» не срабатывает?

#javascript #sockets #oop

#javascript #сокеты #ооп

Вопрос:

У меня есть пользовательский объект:

 function Serverfunctionality(){
    this.socket = new WebSocket('ws://localhost:8080');
    this.uploaded_image = null


    this.sign_up = function (){
        this.socket.addEventListener("open" , () => {
            console.log('works')
            
            this.send_data();
            
            
                
            })
    }
}
 

Затем я вызываю эту функцию следующим образом (которая работает): :

 <button id="signupbutton" onclick="new Serverfunctionality().sign_up()"   type="button">Sign up</button>
 

но если бы я хотел, скажем, создать экземпляр объекта и вызвать его в экземпляре. Например:

 var main = new Serverfunctionality();
 

вызов main.sign_up() не работает.

примечание: файл Serverfunctionality размещен в другом файле, я связываю файлы html и javascript с помощью следующего тега script: <script src="client.js" type="text/javascript" ></script>

Комментарии:

1. где / как main определяется? Этот подход будет работать только в том случае, если main это глобальная переменная. Это один из нескольких основных недостатков использования встроенных onclick атрибутов — гораздо лучше добавлять обработчики событий в JS addEventListener .

2. @RobinZigmond main определяется внутри client.js файл как глобальная переменная. за пределами объекта.

3. похоже, что независимо от того, что я делаю, я могу вызвать эту функцию только при определении нового экземпляра объекта в той же строке.

4. Какую ошибку вы получаете?

5. @Bergi Я не получаю никаких ошибок, но события функции не запускаются. Я начинаю верить, что это как-то связано с подключением к сокету, поскольку при определении экземпляра объекта соединение затем «открывается».

Ответ №1:

Прослушиватель открытых событий не запускался, потому что соединение уже было установлено в моем экземпляре Serverfunctionality с this.socket = new WebSocket('ws://localhost:8080'); объявлением внутри схемы элементов объекта. Причина, по которой это работает здесь: <button id="signupbutton" onclick="new Serverfunctionality().sign_up()" type="button">Sign up</button> это потому, что мы устанавливали соединение при создании экземпляра Serverfunctionality , поэтому мы смогли обработать событие «открыть».

Вместо того, чтобы пытаться запустить блок кода в случае «открытия». проверьте, открыто ли соединение, а затем запустите, поскольку соединение будет открыто до того, как можно будет нажать кнопку.

код:

 this.sign_up = function (){
    
    if (this.socket.readyState == WebSocket.OPEN ) {
        console.log('works')
        this.socket.send("works")
        this.send_data();
        }
        
            
        
}