2016-04-01 15 views
0

ich JS bin neu und habe ein Problem, herauszufinden, warum binden mir Probleme macht:Javascript Probleme mit bind

Hier ist ein Ausschnitt:

var MyTest = function() { 
    registerChannel(address, null, this._messageHandler.bind(this)); 
}; 

MyTest.prototype._messageHandler = function(msg) {  
    this._logToConsole(msg); 
}; 

MyTest.prototype._close = function() { 

    (function(inst) { 
    asyncSend(address, data, 
     function(err, reply) { 
     unregisterChannel(address, inst._messageHandler.bind(inst)); 
     } 
    ); 
    })(this); 
} 

Die registerChannel Methode speichert die Callback-Funktion I übergeben und die unregisterChannel versucht zu überprüfen, ob dieser Rückruf existiert und fehlschlägt, weil 'binden' die Methode kopiert und nicht als Referenz (nach meinem besten Wissen) übergeben.

Das Ergebnis ist, dass fehlschlägt, weil es die Funktion, die ich passierte nicht finden kann.

Wie kann ich das lösen? anwenden \ Anruf? nicht mit denen vertraut ...

Danke und ich hoffe, dass meine Frage Sinn hat ...

Antwort

4

Jedes Mal, wenn Sie .bind Sie eine neue Referenz erhalten nennen, so gewannen die „Register“ und „austragen“ Phasen‘ t passen, weil Sie nicht genau die gleiche Referenz übergeben.

Daher jedes Objekt muss seine eigene Kopie seines gebundenen Handler behalten, z.B .:

var MyTest = function() { 
    this._handler = this._messageHandler.bind(this); 
    registerChannel(address, null, this._handler); 
}; 

und Sie können dann this._handler zu Ihrem unregisterChannel Aufruf übergeben.

Eine Alternative wäre überhaupt nicht _messageHandler auf den prototype zu setzen, und erstellen Sie eine neue Instanz im Konstruktor:

var MyTest = function() { 

    this._messageHandler = (function(msg) { 
    ... 
    }).bind(this); 

    registerChannel(address, null, this._messageHandler); 
}; 
+0

Könnte ‚anwenden‘ oder "nennt auch in diesem Fall helfen? – Shvalb

+0

@Shvalb nein, sie gelten nicht (kein Wortspiel beabsichtigt) - sie rufen tatsächlich Funktionen auf, anstatt passable Referenzen zu erstellen. – Alnitak

+0

Danke! Sie haben mir sehr geholfen! – Shvalb