2015-08-04 8 views
3

Теперь я пытаюсь реализовать Unity Webgl с помощью jslib. Я очень смущен тем, как вызывать метод в функции другого метода. Я хочу вызвать метод Recv при появлении сообщения (ws.onmessage). Но он показывает «TypeError: this.Recv undefined». Не могли бы вы помочь мне разобраться в этом источнике?
Спасибо !!!!!Метод вызова Javascript по другому методу

Вот мой исходный код

var ws = null; 
var init_url = ""; 
var received_msg = ""; 
var error_msg = ""; 

var WebsocketLib = { 
Hello: function(){ 
    window.alert("Hello,world!"); 
}, 
InitSocket: function(url){ 
    init_url = Pointer_stringify(url); 
    console.log("InitWebSocket: "+init_url); 
    ws = new WebSocket(init_url); 
    ws.onopen = function(evt){ 
      console.log("Connect"); 
      isConnected = false; 
      ws.send("hello"); 
     }; 
    ws.onclose = function(evt) { 
      console.log("Close"); 
      isConnected = false; 
     }; 
    ws.onmessage = function(evt) { 
      received_msg = evt.data; 
      console.log("[recv] "+received_msg); 
      this.Recv.call(this); 
     }; 
    ws.onerror = function(evt) { 
      error_msg = evt.data; 
      console.log("[error] "+error_msg); 
      this.Error.call(this); 
     }; 
}, 
Recv: function(){ 
    console.log("[recv] "+received_msg); 
    var buffer = _malloc(received_msg.length + 1); 
    writeStringToMemory(returnStr, buffer); 
    return buffer; 
}, 
Error: function(){ 
    console.log("[error] "+error_msg); 
    var buffer = _malloc(error_msg.length + 1); 
    writeStringToMemory(error_msg, buffer); 
    return buffer; 
} 
} 

ответ

2

Внутри ws.onmessage this будет относиться к ws (как мы находимся внутри метода WS) и не WebsocketLib.

Однако внутри Initsocket, где вы определяете обработчик, this бы правильно (в том смысле, что это то, что вы хотите) относятся к объекту WebsocketLib, так что вы можете создать связанную функцию, чтобы связать внешнююthis значение, которое будет использоваться в качестве this внутри обработчика событий, например:

ws.onmessage = function(evt) { 
     received_msg = evt.data; 
     console.log("[recv] "+received_msg); 
     this.Recv.call(this); 
}.bind(this); 
+0

Благодарим вас за ответ. Это действительно понятно и легко понять. –

2

в JavaScript значение this ведет себя иначе, чем в других языках. Его значение зависит от того, как вызывается функция. Вы можете узнать больше об этом в Mozilla MDN page.

Чтобы решить конкретную проблему, вы можете:

InitSocket: function(url){ 
    var that = this;         // [1] 
    init_url = Pointer_stringify(url); 
    console.log("InitWebSocket: "+init_url); 
    ws = new WebSocket(init_url); 
    ws.onopen = function(evt){ 
      console.log("Connect"); 
      isConnected = false; 
      ws.send("hello"); 
     }; 
    ws.onclose = function(evt) { 
      console.log("Close"); 
      isConnected = false; 
     }; 
    ws.onmessage = function(evt) { 
      received_msg = evt.data; 
      console.log("[recv] "+received_msg); 
      that.Recv.call(that);      // [2] 
     }; 
    ws.onerror = function(evt) { 
      error_msg = evt.data; 
      console.log("[error] "+error_msg); 
      that.Error.call(that);     // [2] 
     }; 
}, 

В строке 1 Я связываю this переменной к пользовательской переменной, что я решил назвать that (но вы можете назвать его как угодно). Затем в строке 2 я использовал that вместо this.

Внутри функций ws.onmessage значение this не относятся к экземпляру WebsocketLib, так что вы должны использовать этот «трюк» и получить доступ к значению правой this используя одну сохраненные в замыкании, внутри значения that.

+0

Спасибо за ваш ответ :) –

+0

Добро пожаловать! – Andrea

+0

Я ученик. Поэтому я полагаю, что 'this.Error.call (this)' не будет работать ни один, не так ли? – iplus26