带有 ES6 / Bluebird Promise的对象方法

IT技术 javascript node.js promise bluebird
2021-02-02 10:56:53

在带有标志的Windows 上使用node 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对象返回一个Promise。

当我使用User如下对象时:

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

this一旦Promise完成,in method2of object 就会在被调用时User结束undefinedthen

我尝试同时使用ES6BluebirdPromise实现。

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

2个回答

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

因为您传递的是函数,而不是绑定到实例的方法。这个问题甚至不是特定promise 的,请参阅如何在回调中访问正确的 `this` 上下文?对于通用解决方案:

….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);

我应该补充一点,这是一个通用的 Javascript 问题,也可以使用普通的 javascript 功能来解决。例如,您还可以这样做:

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

这使用Function.prototype.bind()内置于 Javascript 中并存在于每个函数中的内容。这将创建一个函数存根(它是传递给的,.then()并且该存根将this在调用method2().

这就是我最终为了保持与 es6 Promise兼容而做的事情
2021-03-13 10:56:53
我最终使用了这个解决方案,并在使用单独的原型方法过于冗长的情况下使用了粗箭头语法。我相信两者都是 ES6+ 兼容的。
2021-03-15 10:56:53