Javascript 将承诺连成一条链
我对Express和Mongo有一个登录逻辑。我需要将它们放在一个承诺链中,避免嵌套承诺 这是我的密码:Javascript 将承诺连成一条链,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我对Express和Mongo有一个登录逻辑。我需要将它们放在一个承诺链中,避免嵌套承诺 这是我的密码: const foundUser = User.findOne({ email: email }).exec(); const hashedPassword = bcrypt.hash(password, 10); return Promise.all([foundUser, hashedPassword]) .then(arr => {
const foundUser = User.findOne({ email: email }).exec();
const hashedPassword = bcrypt.hash(password, 10);
return Promise.all([foundUser, hashedPassword])
.then(arr => {
const [ user, hashedPassword ] = arr;
if (user) {
return res.status(400).json({
message: "This email has already occupied."
});
};
const newUser = new User({
fullName,
email,
password: hashedPassword
});
newUser.save()
.then(user => {
return res.status(200).json({
message: `${user.fullName}, you are successfully registered.`
});
})
.catch(err => {
console.log(err);
return res.status(500);
})
})
.catch(err => {
console.log(err);
return res.status(500);
});
我尝试使用将它们与Promise.all
组合,但我的一个承诺取决于前一个承诺,因此我在我的then中添加了newUser.save()
我实现了异步/等待,如下所示:
const foundUser = await User.findOne({ email: email }).exec();
if (foundUser) {
return res.status(400).json({
message: "This email has already occupied."
});
}
const hashedPassword = await bcrypt.hash(password, 10);
const newUser = new User({
fullName,
email,
password: hashedPassword
});
const user = await newUser.save();
return res.status(200).json({
message: `${user.fullName}, you are successfully registered.`
});
} catch (err) {
console.log( err);
return res.status(500).json({
message: 'Error'
})
}
但我想知道有没有一种方法可以做到既有承诺,又不筑巢。
我需要将它们放在一条链上,这样我就可以避免使用multiply-catch,正如@Bergi在评论中提到的那样,您可以从
回调中返回一个承诺。根据此返回的承诺是否得到解决或拒绝,将调用链中的下一个。然后或。catch
。您可以这样做:
const foundUser = await User.findOne({ email: email }).exec();
if (foundUser) {
return res.status(400).json({
message: "This email has already occupied."
});
}
const hashedPassword = await bcrypt.hash(password, 10);
const newUser = new User({
fullName,
email,
password: hashedPassword
});
const user = await newUser.save();
return res.status(200).json({
message: `${user.fullName}, you are successfully registered.`
});
} catch (err) {
console.log( err);
return res.status(500).json({
message: 'Error'
})
}
const foundUser=User.findOne({email:email}).exec();
const hashedPassword=bcrypt.hash(密码,10);
返回Promise.all([foundUser,hashedPassword])
。然后(arr=>{
const[user,hashedPassword]=arr;
如果(用户){
返回res.status(400).json({
消息:“此电子邮件已被占用。”
});
};
const newUser=新用户({
全名,
电子邮件,
密码:hashedPassword
});
返回newUser.save()
})
。然后(用户=>{
返回res.status(200).json({
消息:`${user.fullName},您已成功注册`
});
})
.catch(错误=>{
控制台日志(err);
返回资源状态(500);
});
为什么不改用async/await?@cadenzah是的,我知道,但我想用承诺来实现它。@RobertHovhannisyanasync
/await
是承诺,只是一种比更好的语法,如果你只是想避免多次捕获,那么