我正在尝试理解和掌握 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}.`);
});
}
));
当我遇到这样的事情时,这是使用承诺的正确方法吗?
你可以稍微简化一下,因为你可以删除内部
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}.`);
});
休息看起来还不错
谢谢大家,根据评论我最终得到了下面的代码。尽管我试图避免回调地狱问题,但它看起来仍然有点像,但由于需要调用两个承诺,我认为这是一个很好的解决方案,并且不会嵌套太多:
// 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}.`);
});
}
));
谢谢你, 维克多