Javascript 在输入回调作用域时获取对closure dojo对象的访问权

Javascript 在输入回调作用域时获取对closure dojo对象的访问权,javascript,websocket,dojo,Javascript,Websocket,Dojo,我有一个dojo对象,我想重试连接到web套接字。但是,到web套接字的连接是由回调函数触发的。我尝试订阅主题,以允许在不使用此的情况下重新连接。但是,如果类有两个或多个实例,它将获取MyClass的所有实例上的所有订阅消息。有没有办法只让无法连接的原始实例获取订阅的消息 // Dojo class dojo.declare("MyClass", null, { constructor: function() { dojo.subscribe("WebSocketCon

我有一个dojo对象,我想重试连接到web套接字。但是,到web套接字的连接是由回调函数触发的。我尝试订阅
主题
,以允许在不使用
的情况下重新连接。但是,如果类有两个或多个实例,它将获取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”任何地方都比依赖于
这个
那个
自我
,或者多个开发团队给出的随机名称要一致得多。是的,你会降低一点效率,但在可维护性和可读性方面会获得很多。
这个
是一致的,不会给你任何“惊喜”
挂接装置