与ES6 /蓝鸟承诺对象的方法与ES6 /蓝鸟承诺对象的方法(Object method with

2019-05-10 10:27发布

我使用节点v0.11.14-夜间-20140819-前在Windows与harmony标志。

我有一个在它的原型定义了两个方法的JavaScript对象:

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

serviceMethodService对象返回一个承诺。

当我使用User对象象下面这样:

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

thismethod2对象的User结束了undefined时称为then一次承诺满足。

我试图同时使用ES6蓝鸟承诺的实现。

为什么this最终被undefined在这种情况下?

Answer 1:

为什么this最终被undefined在这种情况下?

因为你传递一个函数,而不是一个方法绑定到一个实例。 这个问题甚至没有答应,具体请参见如何访问一个回调中正确的`this`背景? 对于通用的解决方案:

….then(this.method2.bind(this))… // ES5 .bind() Function method

….then((r) => this.method2(r))… // ES6 arrow function

然而, 蓝鸟确实提供了另一种方式来调用函数的方法:

this.service.serviceMethod(args)
    .bind(this)
    .then(this.method2)
    .catch(onRejected);


Answer 2:

我要补充一点,这是一个通用的Javascript的问题,也可以用普通的JavaScript功能来解决。 例如,你也可以这样做:

User.prototype.method1 = function () {
    .............
    this.service.serviceMethod(args)
        .then(this.method2.bind(this))
        .catch(onRejected);
};

这将使用Function.prototype.bind()内置于Javascript和存在于每一个功能。 这将创建一个函数存根(这是传递给.then()和存根将自动重新安装所需this之前调用值method2()



文章来源: Object method with ES6 / Bluebird promises