我想从承诺而不是所有这些嵌套函数中受益。下面的代码工作(以一种方式哈哈)。问题是,当它检测到用户名或电子邮件存在时,它返回"Email is already in use."
或"Username is already in use."
,然后仍然执行最后一个承诺p3
,它将用户添加到数据库(它不应该)。也许我误解了这个概念。什么是正确的方法来做到这一点?如何在承诺拒绝时停止执行?
var p1 = new Promise(
(res, rej) => {
Database.doesEmailExist(userObj.email,
(err, exists) => {
if(err) return rej(err);
if(exists) return rej("Email is already in use.");
return res();
}
);
}
);
var p2 = new Promise(
(res, rej) => {
Database.doesUsernameExist(userObj.username,
(err, exists) => {
if(err) return rej(err);
if(exists) return rej("Username is already in use.");
return res();
}
)
}
);
var p3 = new Promise(
(res, rej) => {
Database.addUserToDB(userObj.username, userObj.email, bcrypt.hashSync(userObj.password),
(err) => {
if(err) return rej(err);
return res();
}
)
}
);
Promise.all([p1, p2, p3]).then(success => {
return callback("true", "You have successfully registered.");
}).catch(reason => {
return callback("false", reason);
});
仍然执行什么其他的语句? 'Promise.all()'并行运行所有操作。如果你想让它们按顺序运行,你需要一个不同的方案。像往常一样,如果你描述你正在努力完成的事情,我们可以帮助你更好。 – jfriend00
对不起,我解释得不好。将编辑。所以说数据库中存在一个用户名。它将运行'rej()'并返回给用户“用户名已被使用”,但它不会停止执行下一个Promise'p3'。即使先前的承诺被拒绝,它也会将用户添加到数据库中。 – user2287474
因为你已经开始了所有三个异步操作。 'Promise.all()'只是监控所有三个,并告诉你他们什么时候完成或者他们中的任何一个被拒绝。如果你想排序你的操作,只有在上一步成功完成时才执行下一步,请描述你想要的问题。 – jfriend00