Вызов методов объекта с обещаниями и контекстом «этот»

Я понимаю, что в объектах Javascript ключевое слово this определяется не объявлением, а вызовом. Поэтому мне интересно, как мы можем избежать следующей проблемы:

var testObject = function(){
    this.foo = "foo!";
};

testObject.prototype.sayFoo = function() {
    console.log(this.foo);
};

var test = new testObject();
test.sayFoo(); //Prints "!foo"

new Promise(function(resolve, reject){
    resolve();
}).then(test.sayFoo); //Unhandled rejection TypeError: Cannot read property 'foo' of undefined

Is:

new Promise(function(resolve, reject){
    resolve();
}).then(function(){
    test.sayFoo();
});

единственное решение?


person Nepoxx    schedule 27.05.2015    source источник


Ответы (1)


Нет, вы можете использовать метод bind также:

Promise.resolve().then(test.sayFoo.bind(test));

См. также Как получить доступ к правильному контексту this внутри обратного вызова? для общей проблемы.

Однако Bluebird предлагает дополнительный способ вызова метода:

Promise.resolve().bind(test).then(test.sayFoo);
person Bergi    schedule 27.05.2015