进入回调范围时获取对闭包 dojo 对象的访问权限

Get access to closure dojo object when callback scope was entered

我有一个 dojo 对象,我想重试连接到网络套接字。但是,与 Web 套接字的连接是由回调函数触发的。我尝试订阅 topic 以允许在不使用 this 的情况下重新连接。但是,如果 class 有两个或更多实例,它会获取 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);

        };

    }
}

注:我正在做的项目使用的是dojo 1.4。很旧,但我没有升级它的权限。

您不想连接到 this 的任何特定原因?

当您发布或订阅时,它取决于用于识别 "event" 的字符串 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);

    };

}

}

如何生成 uniqueID 取决于您,它可以像全局计数器一样简单,也可以使用一些逻辑来创建 GUID。只要是唯一的,任何东西都可以工作。

使用动态主题名称:

// Dojo class
define(['dijit/registry', 'dojo/_base/declare', 'dojo/topic'], function(registry, declare, topic) {
  declare("MyClass", null, {

      constructor: function() {
        var uniqId = registry.getUniqueId('WebSocketConnect'),
          doConnect = this._DoConnect;

        //for external use
        this.DoConnect = function() {
          doConnect(uniqId);
        }

        //from internal fail
        topic.subscribe("WebSocketConnect" + uniqId, this.DoConnect());



      },

      _DoConnect: function(uniqId) {
        this.myWebSocket = new WebSocket('ws://192.0.0.1');

        // ウェブソケットは閉じたイベント
        this.myWebSocket.onclose = function() {

          // The this in this clousure is "myWebSocket"
          setTimeout(function() {
            topic.publish("WebSocketConnect" + uniqId, []);
          }, 5000);

        };

      }
    }
  });
});

但最好是使用挂钩:

// Dojo class
define(['dojo/_base/declare'], function(declare) {
  declare("MyClass", null, {
      DoConnect: function() {
        this.myWebSocket = new WebSocket('ws://192.0.0.1');

        // ウェブソケットは閉じたイベント
        this.myWebSocket.onclose = lang.hitch(this, function() {
          setTimeout(lang.hitch(this, 'DoConnect'), 5000);
        });

      }
    }
  });
});