2016-05-26 13 views
1

Ich habe eine ES6-Klasse, die ein zurückgestelltes Objekt als Instanzvariable hat. Ich versuche, das this Objekt innerhalb eines AngularJS Versprechen, ähnlich dem folgenden zugreifen, aber this ist nicht definiert, nach babel:Zugriff auf dieses Objekt in ES6 in einem Versprechen

class MyClass { 

    constructor($q) { 
    this.deferred_ = $q.defer(); 
    } 

    myMethod() { 
    this.deferred_.promise.then(data => { 
     console.log(this); 
    }); 
    } 
} 

Irgendwie glaube ich, zwei Pfeil-Funktionen verwenden sollten this auf den Umfang zu binden Versprechen, aber ich kann nicht herausfinden, wie. Irgendeine Idee, wie man das macht?

+1

In diesem Code würde "this" sicher auf die Instanz von 'MyClass' verweisen. – zerkms

+0

Es tut es nicht. Ich denke, die .Promise-Notation stiehlt das aus dem Klassenumfang. Ich bin mir nicht sicher, warum es nicht funktioniert. – mohi666

+1

Nun, ** tut es ** https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&experimental=true&loose=false&spec=true&playground=true&code=class%20MyClass%20%7B % 0D% 0A% 0D% 0A% 20% 20Konstruktor (% 24q)% 20% 7B% 0D% 0A% 20% 20% 20% 20Disferred_% 20% 3D% 20% 24qDefer()% 3B% 0D % 0A% 20% 20% 7D% 0D% 0A% 0D% 0A% 20% 20myMethod()% 20% 7B% 0D% 0A% 20% 20% 20% 20this.defertiger_.Promise.then (Daten% 20% 3D % 3E% 20% 7B% 0D% 0A% 20% 20% 20% 20% 20% 20console.log (dies)% 3B% 0D% 0A% 20% 20% 20% 20% 7D)% 3B% 0D% 0A % 20% 20% 7D% 0D% 0A% 7D Bitte geben Sie ein Beispiel an, das Ihr Problem veranschaulicht, Ihr gebuchter Code ist in Ordnung. – zerkms

Antwort

2

Es spielt keine Rolle, welche Bibliothek Sie verwenden, Sie können den Kontext einer Pfeilfunktion nicht ändern.

var x = 5; 
var f =()=> this.x; 

f();    //=> 5 
f.call({x:3}); //=> 5 
z.bind({x:3})(); //=> 5 

So, wie andere bemerkt haben, in dem Code, den Sie geschrieben haben, werden this auf die Instanz von MyClass beziehen. Und daran kann nichts ändern.

+0

Ich habe das Problem mit der Chrome-Dev-Konsole debuggt. Ich wurde dort undefiniert. Ich nehme an Chrome-Dev-Konsole, ES6 überhaupt nicht unterstützt. Deshalb kehrte es unbestimmt zurück. – mohi666

+0

@ mohi666 Ich bin mir ziemlich sicher, dass nichts eine vollständige Implementierung von ES6 hat, aber Chrome (und seine Entwicklerkonsole) unterstützt * einige * (ich würde sogar sagen * die meisten *) ES6-Funktionen. – naomik

+0

* Dies bezieht sich auf die Instanz von MyClass. Und es gibt nichts, was jemals das ändern könnte * diese Linie ist nicht streng zutreffend. 'var c = neue MyClass; c.myMethod.call ({}); 'würde die' this'-Referenz von 'myMethod' binden und daher würde der Pfeil auch die Referenz verwenden. Zugegeben, dass Referenz auch eine 'deferred_' -Eigenschaft benötigen würde, um den Pfeil aber dennoch zu erreichen – CodingIntrigue

Verwandte Themen