我在带有标志的Windows上使用 节点v0.11.14-nightly-20140819-preharmony。
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); }
serviceMethod的Service对象返回一个承诺。
serviceMethod
Service
当我使用User如下对象时:
User
let user = new User(args); user.method1();
this在method2对象的User结束undefined时,由被称为then一旦承诺得到满足。
this
method2
undefined
then
我尝试同时使用 ES6 和 Bluebird promise实现。
为什么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);