现在我尝试用jslib实现Unity Webgl。我对如何在另一种方法的功能中调用方法感到困惑。我想在消息来临时调用方法Recv(ws.onmessage)。但是,它显示" TypeError:this.Recv未定义"。你能帮我弄清楚这个来源吗?
谢谢!!!!!
这是我的源代码
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;
}
}
答案 0 :(得分: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);
答案 1 :(得分:2)
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
的值内。