Método de objeto con promesas de ES6/Bluebird
Estoy usando el nodo v0.11.14-nightly-20140819-pre en Windows con harmony
bandera.
Tengo un objeto JavaScript con dos métodos definidos en su prototipo:
function User (args) {
this.service= new Service(args);
}
User.prototype.method2 = function (response) {
console.log(this); // <= UNDEFINED!!!!
};
User.prototype.method1 = function () {
.............
this.service.serviceMethod(args)
.then(this.method2)
.catch(onRejected);
};
function onRejected(val) {
console.log(val);
}
serviceMethod
del Service
objeto devuelve una promesa.
Cuando uso User
un objeto como el siguiente:
let user = new User(args);
user.method1();
this
El method2
objeto User
termina undefined
cuando lo llama then
una vez que se cumple la promesa.
Intenté utilizar la implementación de promesas de ES6 y Bluebird .
¿Por qué this
termina siendo undefined
en este caso?
¿Por qué
this
termina siendoundefined
en este caso?
Porque estás pasando una función, no un método vinculado a una instancia. Este problema ni siquiera es específico de la promesa; consulte ¿ Cómo acceder al contexto correcto "este" dentro de una devolución de llamada? para la solución genérica:
….then(this.method2.bind(this))… // ES5 .bind() Function method
….then((r) => this.method2(r))… // ES6 arrow function
Sin embargo, Bluebird ofrece otra forma de llamar a la función como método:
this.service.serviceMethod(args)
.bind(this)
.then(this.method2)
.catch(onRejected);
Debo agregar que este es un problema genérico de Javascript y también se puede resolver usando funciones simples de JavaScript. Por ejemplo, también podrías hacer esto:
User.prototype.method1 = function () {
.............
this.service.serviceMethod(args)
.then(this.method2.bind(this))
.catch(onRejected);
};
Esto utiliza Function.prototype.bind()
el que está integrado en Javascript y presente en cada función. Esto crea un código auxiliar de función (que es a lo que se pasa .then()
y ese código auxiliar volverá a adjuntar automáticamente el this
valor deseado antes de llamar method2()
.