Método de objeto con promesas de ES6/Bluebird

Resuelto krl asked hace 9 años • 2 respuestas

Estoy usando el nodo v0.11.14-nightly-20140819-pre en Windows con harmonybandera.

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);
}

serviceMethoddel Serviceobjeto devuelve una promesa.

Cuando uso Userun objeto como el siguiente:

let user = new User(args);
user.method1();

thisEl method2objeto Usertermina undefinedcuando lo llama thenuna vez que se cumple la promesa.

Intenté utilizar la implementación de promesas de ES6 y Bluebird .

¿Por qué thistermina siendo undefineden este caso?

krl avatar Nov 26 '14 19:11 krl
Aceptado

¿Por qué thistermina siendo undefineden 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);
Bergi avatar Nov 26 '2014 12:11 Bergi

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 thisvalor deseado antes de llamar method2().

jfriend00 avatar Nov 26 '2014 15:11 jfriend00