我使用的课程如下
var user_class = function (body) {
this.body = body;
};
user_class.prototype.login = function () {
var that = this;
return new Promise((fullfill,reject)=>{
that.find_by_username()
.then(that.user_exists)
.then(that.check_credentials)
.then(that.generate_token)
.then(fullfill)
.catch(reject);
});
};
user_class.prototype.find_by_username = function () {
var that = this;
return new Promise((fullfill,reject)=>{
user_model
.find({username: that.body.username})
.then((user)=>{
that.user = user;
})
.then(fullfill)
.catch(reject);
});
};
user_class.prototype.user_exists = function () {
var that = this;
return new Promise((fullfill,reject)=>{
console.log(that.user);
if(that.user !== undefined) {
fullfill();
}else{
reject(new Error('null user'));
}
});
};
问题是,当我调用login
方法时,find_by_username
函数工作正常,用户我们设置正确,我在console.log
that.user
验证了该问题。但user_exits
方法抛出错误,这意味着它发现user
设置为undefined。我已经提到this
到that
但仍然没有工作。
有人可以解释我的逻辑有什么问题,以及为什么用户没有设置为对象?
答案 0 :(得分:2)
你的问题是上下文的松散但不像你想的那样。这不是因为这个是通过绑定覆盖的,而是因为你在传递函数时松散了上下文:
user_class.prototype.login = function () {
return new Promise((fullfill,reject)=>{
this.find_by_username()
.then(this.user_exists.bind(this))
.then(this.check_credentials.bind(this))
.then(this.generate_toke.bind(this))
.then(fullfill)
.catch(reject);
});
};