以这种方式使用Promise是好事吗?

时间:2018-03-08 11:14:52

标签: javascript node.js promise es6-promise

我正在努力理解并掌握承诺,但我遇到了一个问题,我不确定这是否是正确的做事方式。

我正在使用nodejs,我有以下内容: 一个数据库和一个模块,我在其中使用数据库。有一次,我试图在数据库中创建一个新用户,并在创建用户之后在另一个表中为该用户创建另一个具有其他详细信息的条目。

passport.use('local-signup', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',

  },
  function(username, password, done) {

    // Before creating the user access Sequlize beforeCreate method so we can encrypt the password
    User.beforeCreate(function(req) {
      console.log('Encryptying password for user ',req.username)
      return encryptPass(req.password)
      .then(success => {
        req.password = success;
      })
      .catch(err => {
        if (err) console.error(err);
      });
    });

    User.create({
      username: username,
      password: password
    }).then(function(createdUser) {
      console.log(createdUser);
      UserDetails.create({
        id:createdUser.dataValues.id
      }).then((data)=>{
        console.log(data);
        return done(null,createdUser);
      }).catch((error)=>{
        console.log(error)
        return done(error)
      })
    })
    .catch(function(error) {
      console.error(error)
      return done(`${error.message}.`);
    });
  }
));

当我有这样的东西时,这是使用承诺的正确方法吗?

如果您需要更多信息,请告诉我,我会尽量让所有内容更清晰。

最诚挚的问候, 维克多

2 个答案:

答案 0 :(得分:1)

您可以稍微简化一下,因为您可以移除内部catch块,只需要返回内部Promise

User.create({
    username: username,
    password: password
}).then(function (createdUser) {
    console.log(createdUser);
    return UserDetails.create({
        id: createdUser.dataValues.id
    }).then((data) => {
        console.log(data);
        return done(null, createdUser);
    })
}).catch(function (error) {
    console.error(error);
    return done(`${error.message}.`);
});

休息看起来不错

答案 1 :(得分:0)

谢谢大家,根据评论我最终得到了以下代码。尽管我试图避免回调地狱问题,但它仍然看起来有点像它,但由于两个承诺都需要被调用,我认为这是一个很好的解决方案而不是将它嵌套到很多:

 // Local sign-up strategy
  passport.use('local-signup', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',

  },
  function(username, password, done) {

    // Before creating the user access Sequlize beforeCreate method so we can encrypt the password
    User.beforeCreate(function(req) {
      console.log('Encryptying password for user ',req.username)
      return encryptPass(req.password)
      .then(success => {
        req.password = success;
      })
      .catch(err => {
        if (err) console.error(err);
      });
    });

    User.create({
      username: username,
      password: password
    }).then(function(createdUser) {
      console.log(createdUser);
      return createdUser;
    }).then((userData) =>{
      UserDetails.create({
        id:userData.dataValues.id
      }).then((userDetails)=>{
        return done(null,userData)
      })
    }).catch(function(error) {
      console.error(error)
      return done(`${error.message}.`);
    });
  }
));

谢谢你, 维克多