在onOpen之后,WebSocket是空的

时间:2014-09-28 11:22:15

标签: javascript websocket

我尝试使用以下代码连接Websocket:

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被称为socket时,似乎是未定义的。我首先想到可能在onOpen之后关闭套接字,但是从不调用onClose,也从不调用onError。

我的错误是什么?

1 个答案:

答案 0 :(得分: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来引用套接字。