2016-07-15 7 views
0

Ich habe ein Dojo-Objekt, ich möchte eine Retry-Verbindung zu einem Web-Socket. Die Verbindung zum Web-Socket wird jedoch durch eine Callback-Funktion ausgelöst. Ich habe versucht, eine topic zu abonnieren, um eine erneute Verbindung zu ermöglichen, ohne this zu verwenden. Wenn die Klasse jedoch über zwei oder mehr Instanzen verfügt, werden alle abonnierten Nachrichten für alle Instanzen von MyClass abgerufen. Gibt es eine Möglichkeit, nur die ursprüngliche Instanz, die keine Verbindung herstellen kann, die abonnierte Nachricht abzurufen?Zugriff auf Closure-Dojo-Objekt, wenn Callback-Bereich eingegeben wurde

// 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); 

     }; 

    } 
} 

Hinweis: Das Projekt, an dem ich gerade arbeite, verwendet Dojo 1.4. Ziemlich alt, aber ich habe keine Erlaubnis, es zu aktualisieren.

+1

Ist 'MyClass' sein soll ein Singleton? Wenn nein, funktioniert auch Ihr Konstruktor nicht. – Bergi

+0

@Bergi Warum würde der Konstruktor nicht funktionieren? Ich habe das verwendet, um die Instanz anzuzeigen? Was vermisse ich? – Nap

+0

Genau aus dem Grund, den Sie bereits angegeben haben, erhalten * alle * Instanzen ein solches globales Ereignis. – Bergi

Antwort

1

Gibt es einen bestimmten Grund, warum Sie keine Verbindung zu this herstellen möchten?

Wenn Sie veröffentlichen oder subskribieren, hängt es von der String-ID ab, die zur Identifizierung des "Ereignisses" verwendet wird. Wenn Sie es für jede Instanz eindeutig machen könnten, könnten Sie die Ausführung der Funktion für alle Instanzen verhindern.

// 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); 

    }; 

} 

}

Wie Sie erzeugen die uniqueID bis zu Ihnen ist, könnte es als globaler Zähler so einfach sein oder eine gewisse Logik verwenden, um eine GUID zu erstellen. Alles wird funktionieren, solange es einzigartig ist.

+1

'hitch' ist besser als' self' – ben

+0

@ben - das Ändern des ganzen Kontexts ist nicht effizient, nur um einen variablen Wert zu erhalten, daher habe ich 'self' verwendet. Wenn wir das Mehtod in diesem Kontext ausführen müssen, ist es besser "anzuhängen". –

+0

Nun, es ist immer die Frage der Effizienz über die Wartbarkeit. Ein konsistentes "dieses" überall zu haben, ist viel konsequenter, als sich auf "dieses", "dieses", "selbst" oder zufällige Namen zu stützen, die von mehreren Entwicklerteams gegeben werden. Ja, Sie verlieren ein wenig an Effizienz, aber Sie gewinnen viel an Wartbarkeit und Lesbarkeit. 'this' ist konsistent und gibt dir keine" Überraschung " – ben

1

einen dynamischen Themennamen verwenden:

// 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); 
 

 
     }; 
 

 
     } 
 
    } 
 
    }); 
 
});

aber am besten ist hitch zu verwenden:

// 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); 
 
     }); 
 

 
     } 
 
    } 
 
    }); 
 
});