2016-05-26 6 views
1

У меня есть класс ES6, который имеет отложенный объект как переменную экземпляра. Я пытаюсь получить доступ к this объект внутри angularjs обещание, подобное следующему, но this не определен, согласно Бабеля:Доступ к этому объекту в ES6 внутри обещания

class MyClass { 

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

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

Как-то я думаю, что я должен использовать две функции со стрелками, чтобы связать this с областью обещания, но я не могу понять, как это сделать. Любая идея, как это сделать?

+1

В этом коде 'this' наверняка будет ссылаться на экземпляр' MyClass'. – zerkms

+0

Это не так. Я думаю, нотация .promise крадет это из класса. Я не слишком уверен, почему это не работает. – mohi666

+1

Ну, ** он делает ** 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% 20constructor (% 24Q)% 20% 7B% 0D% 0A% 20% 20% 20% 20% 20this.deferred_% 3D% 20% 24q.defer()% 3B% 0D % 0A% 20% 20% 7D% 0D% 0A% 0D% 0A% 20% 20myMethod()% 20% 7B% 0D% 0A% 20% 20% 20% 20this.deferred_.promise.then (данные% 20% 3D % 3E% 20% 7B% 0D% 0A% 20% 20% 20% 20% 20% 20console.log (это)% 3B% 0D% 0A% 20% 20% 20% 20% 7D)% 3B% 0D% 0A % 20% 20% 7D% 0D% 0A% 7D Просьба привести пример, демонстрирующий вашу проблему, ваш опубликованный код в порядке. – zerkms

ответ

2

Не имеет значения, какую библиотеку вы используете, вы не можете изменить контекст функции стрелки.

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

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

Таким образом, как и другие отметили, в коде вы в курсе, this будет относиться к экземпляру MyClass. И нет ничего, что могло бы изменить это.

+0

Я отлаживал проблему с помощью консоли Chrome chrome. Там я стал неопределенным. Я предполагаю, что консоль Chrome Chrome не поддерживает ES6 вообще. Вот почему он возвращался не определен. – mohi666

+0

@ mohi666 Я почти уверен, что ничто не имеет полной реализации ES6, но Chrome (и его консоль разработчика) поддерживает * некоторые * (я даже сказал * большинство *) ES6 featues. – naomik

+0

* Это будет ссылка на экземпляр MyClass. И нет ничего, что могло бы изменить это. * Эта строка не является строго верной. 'var c = new MyClass; c.myMethod.call ({}); 'будет связывать ссылку' this' 'myMethod' и, следовательно, стрелка будет использовать ссылку. Предоставлено, что для ссылки также потребуется свойство 'deferred_' для достижения стрелки, но все же – CodingIntrigue

Смежные вопросы