一尘不染

ES6 / Bluebird的对象方法

javascript

我在带有标志的Windows上使用 节点v0.11.14-nightly-20140819-preharmony

我的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一旦承诺得到满足。

我尝试同时使用 ES6Bluebird promise实现。

为什么this最终会undefined出现这种情况?


阅读 388

收藏
2020-05-01

共1个答案

一尘不染

为什么this最终会undefined出现这种情况?

因为您传递的是函数,而不是方法绑定的实例。对于通用解决方案:

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

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

但是,Bluebird确实提供了另一种方法来调用函数:

this.service.serviceMethod(args)
    .bind(this)
    .then(this.method2)
    .catch(onRejected);
2020-05-01