在nodejs中使用类和promise时出错?

时间:2017-08-19 07:17:47

标签: javascript node.js promise

我正在使用以下代码调用类

var user_ctx = new user();
user_ctx
    .set_email(req.body.email)
    .then(user_ctx.set_username(req.body.username))
    .catch((err)=>{
        console.log(err);
    });

并且类定义如下

function user () {
    this.user = {};
};

user.prototype.set_username = function (username) {
    return new Promise((fullfill,reject)=>{
        this.user.username = username;
        fullfill();
    });
};

user.prototype.set_email = function (email) {
    return new Promise((fullfill,reject)=>{
        var email_ctx = new email_lib(email);
        email_ctx
            .is_valid()
            .then(function() {
                this.user.email = email;
            })
            .then(fullfill)
            .catch(reject);
    });
};

问题是email我们没有在用户中定义。我也试过以下

user.prototype.set_email = function (email) {
    return new Promise((fullfill,reject)=>{
        var email_ctx = new email_lib(email);
        var that = this;
        email_ctx
            .is_valid()
            .then(function() {
                that.user.email = email;
            })
            .then(fullfill)
            .catch(reject);
    });
};

从而在回调函数内使用that引用它;但电子邮件仍未设置。已经尝试记录变量emailset_email的承诺链中,我在哪里错了?

1 个答案:

答案 0 :(得分:1)

由于多个错误/不正确的实现,您的代码无法按预期工作:

  1. 您立即致电action event,无需等待承诺即可解决。您必须使用user_ctx.set_username
  2. 而不是.then(user_ctx.set_username(req.body.username))
  3. 通过构造函数创建Promise,当调用服务.then(() => user_ctx.set_username(req.body.username))已经返回一个promise。
  4. 您使用了错误的email_ctx。函数this内部指向父函数。
  5. 正确实施可能如下所示:

    this