2014-09-28 2 views
1

Я пытаюсь использовать следующий код для подключения WebSocket:WebSocket является Null после OnOpen

var sConn = { 
    socket: null, 
    uri: "ws://" + window.location.host + "/socket/", 

    init: function() { 
     this.socket = new WebSocket(this.uri); 
     this.socket.onopen = this.onOpen; 
     this.socket.onclose = this.onClose; 
     this.socket.onerror = this.onError; 
     this.socket.onmessage = this.onMessage; 
    }, 


    onOpen: function(){ 
     console.log(this.socket); // prints "undefined" 
     this.socket.send("Hello Server!"); // can't read property send of undefined 
    }, 
    onClose: function(event){ 
     console.log("Close:",event); // is never called 
    }, 
    onError: function(err){ 
     console.log("Error:",err); // also never called 
    }, 
    onMessage: function(msg){ 
     console.log("Got Message:",msg); 
    } 
}; 
$(document).ready(function(){ 
    sConn.init(); 
}); 

, к сожалению, когда OnOpen называется сокет кажется неопределенным. Сначала я подумал, что сокет закрывается сразу после onOpen, но onClose никогда не вызывается и onError также никогда не вызывается.

В чем моя ошибка?

ответ

1

Вы теряете контекст связывания в init().

Попробуйте переписать его так:

init: function() { 
    this.socket = new WebSocket(this.uri); 
    this.socket.onopen = this.onOpen.bind(this); 
    this.socket.onclose = this.onClose.bind(this); 
    this.socket.onerror = this.onError.bind(this); 
    this.socket.onmessage = this.onMessage.bind(this); 
} 

Это гарантирует, что все функции обработчика событий в sConn выполняются с правильным this контекстом.

В качестве альтернативы вы можете обратиться к гнезду с sConn.socket вместо this.socket.

+0

Спасибо :) это сработало – user4007301

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