Javascript 在输入回调作用域时获取对closure dojo对象的访问权
我有一个dojo对象,我想重试连接到web套接字。但是,到web套接字的连接是由回调函数触发的。我尝试订阅Javascript 在输入回调作用域时获取对closure dojo对象的访问权,javascript,websocket,dojo,Javascript,Websocket,Dojo,我有一个dojo对象,我想重试连接到web套接字。但是,到web套接字的连接是由回调函数触发的。我尝试订阅主题,以允许在不使用此的情况下重新连接。但是,如果类有两个或多个实例,它将获取MyClass的所有实例上的所有订阅消息。有没有办法只让无法连接的原始实例获取订阅的消息 // Dojo class dojo.declare("MyClass", null, { constructor: function() { dojo.subscribe("WebSocketCon
主题
,以允许在不使用此
的情况下重新连接。但是,如果类有两个或多个实例,它将获取MyClass的所有实例上的所有订阅消息。有没有办法只让无法连接的原始实例获取订阅的消息
// Dojo class
dojo.declare("MyClass", null, {
constructor: function() {
dojo.subscribe("WebSocketConnect", this, function() {
this.DoConnect();
});
},
DoConnect: function() {
this.myWebSocket = new WebSocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose = function () {
// The this in this clousure is "myWebSocket"
setTimeout(function() {
dojo.publish("WebSocketConnect", [ ] );
}, 5000);
};
}
}
注意:我正在处理的项目使用Dojo1.4。非常旧,但我没有升级它的权限。您不想连接到此
的任何特定原因
发布或订阅时,它取决于用于标识“事件”的字符串id,如果可以使每个实例都具有唯一性,则可以阻止函数在所有实例上执行
// Dojo class
dojo.declare("MyClass", null, {
uniqueID:"",
constructor: function() {
this.uniqueID = <generate unique id>;
dojo.subscribe("WebSocketConnect" + this.uniqueID, this, function() {
this.DoConnect();
});
},
DoConnect: function() {
var self = this;
this.myWebSocket = new WebSocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose = function () {
// The this in this clousure is "myWebSocket"
setTimeout(function() {
dojo.publish("WebSocketConnect" + self.uniqueID, [ ] );
}, 5000);
};
}
//Dojo类
declare(“MyClass”,null{
唯一性:“,
构造函数:函数(){
this.uniqueID=;
subscribe(“WebSocketConnect”+this.uniqueID,this,function(){
this.DoConnect();
});
},
DoConnect:function(){
var self=这个;
this.myWebSocket=newwebsocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose=函数(){
//在这个clousure中,最重要的是“myWebSocket”
setTimeout(函数(){
publish(“WebSocketConnect”+self.uniqueID,[]);
}, 5000);
};
}
}
如何生成唯一ID取决于您,它可以像全局计数器一样简单,也可以使用一些逻辑来创建GUID。只要它是唯一的,任何东西都可以工作。您不想连接到此的任何特定原因
发布或订阅时,它取决于用于标识“事件”的字符串id,如果可以使每个实例都具有唯一性,则可以阻止函数在所有实例上执行
// Dojo class
dojo.declare("MyClass", null, {
uniqueID:"",
constructor: function() {
this.uniqueID = <generate unique id>;
dojo.subscribe("WebSocketConnect" + this.uniqueID, this, function() {
this.DoConnect();
});
},
DoConnect: function() {
var self = this;
this.myWebSocket = new WebSocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose = function () {
// The this in this clousure is "myWebSocket"
setTimeout(function() {
dojo.publish("WebSocketConnect" + self.uniqueID, [ ] );
}, 5000);
};
}
//Dojo类
declare(“MyClass”,null{
唯一性:“,
构造函数:函数(){
this.uniqueID=;
subscribe(“WebSocketConnect”+this.uniqueID,this,function(){
this.DoConnect();
});
},
DoConnect:function(){
var self=这个;
this.myWebSocket=newwebsocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose=函数(){
//在这个clousure中,最重要的是“myWebSocket”
setTimeout(函数(){
publish(“WebSocketConnect”+self.uniqueID,[]);
}, 5000);
};
}
}
如何生成uniqueID取决于您,它可以像全局计数器一样简单,也可以使用一些逻辑来创建GUID。只要是唯一的,任何东西都可以工作。使用动态主题名称:
//Dojo类
定义(['dijit/registry','dojo/_base/declare','dojo/topic'],函数(registry,declare,topic){
声明(“MyClass”,null{
构造函数:函数(){
var uniqId=registry.getUniqueId('WebSocketConnect'),
doConnect=这个;
//外用
this.DoConnect=函数(){
doConnect(uniqId);
}
//从内部失败
subscribe(“WebSocketConnect”+uniqId,this.DoConnect());
},
_DoConnect:函数(uniqId){
this.myWebSocket=newwebsocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose=函数(){
//在这个clousure中,最重要的是“myWebSocket”
setTimeout(函数(){
发布(“WebSocketConnect”+uniqId,[]);
}, 5000);
};
}
}
});
});
使用动态主题名称:
//Dojo类
定义(['dijit/registry','dojo/_base/declare','dojo/topic'],函数(registry,declare,topic){
声明(“MyClass”,null{
构造函数:函数(){
var uniqId=registry.getUniqueId('WebSocketConnect'),
doConnect=这个;
//外用
this.DoConnect=函数(){
doConnect(uniqId);
}
//从内部失败
subscribe(“WebSocketConnect”+uniqId,this.DoConnect());
},
_DoConnect:函数(uniqId){
this.myWebSocket=newwebsocket('ws://192.0.0.1');
// ウェブソケットは閉じたイベント
this.myWebSocket.onclose=函数(){
//在这个clousure中,最重要的是“myWebSocket”
setTimeout(函数(){
发布(“WebSocketConnect”+uniqId,[]);
}, 5000);
};
}
}
});
})MyClass
是否应该是一个单实例?如果不是,那么你的构造函数也不起作用。@Bergi为什么构造函数不起作用?我用this来表示实例?我缺少了什么?正是由于你刚才所说的原因,所有实例都会收到这样一个全局事件。MyClass
是否应该是一个单实例ton?如果没有,那么你的构造函数也不起作用。@Bergi为什么构造函数不起作用?我用this来表示实例?我缺少什么?正是因为你已经说过的原因,所有实例都会收到这样的全局事件。hitch
比self
@ben更好-更改整个上下文是没有效率的只是为了得到一个变量值,因此我使用了self
。如果我们必须在该上下文中执行该方法,那么最好是hitch
。好吧,这始终是效率高于可维护性的问题。有一个一致的“this”任何地方都比依赖于这个
,那个
,自我
,或者多个开发团队给出的随机名称要一致得多。是的,你会降低一点效率,但在可维护性和可读性方面会获得很多。这个
是一致的,不会给你任何“惊喜”挂接装置
比