在课堂上使用承诺我在哪里错了?

时间:2017-06-21 09:27:15

标签: javascript node.js javascript-objects

我使用的课程如下

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。我已经提到thisthat但仍然没有工作。

有人可以解释我的逻辑有什么问题,以及为什么用户没有设置为对象?

1 个答案:

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