包含Promise的函数返回值



我想被告知关于一个用户的登录状态。例如,如果用户尝试使用数据库中的现有电子邮件注册,我希望获得返回值STATUS_DUPLICATE_EMAIL(字符串)。另一种可能性是,如果用户试图使用以前登录的社交媒体帐户使用电子邮件登录,我希望获得返回值STATUS_SNS_EMAIL

代码片段:

app.post("/api/signup", (req, res) => {
const status = checkEmail(req, res);
// some sign up logic...
}
...
checkEmail = (req, res) => {
Database.findOne({ 
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}

return STATUS_DUPLICATE_EMAIL;
}

当我尝试console.logstatus时,它是undefined,我不知道为什么会这样。从checkEmail这样的函数中获得返回值的一般方法是什么?

status的值是checkEmail()函数返回的值-目前为空。
你应该做的是返回你的承诺(Database.findOne)从你的checkEmail.
现在状态的值将是你返回的承诺。
现在你应该再次调用它的方法then来获取值。

承诺被解决,但Javascript引擎读取你的代码之前。因此,promise的方法then也会返回一个promise。

app.post("/api/signup", (req, res) => {
checkEmail(req, res).then(desired_value => {
const status = desired_value;
}
}
...
checkEmail = (req, res) => {
return Database.findOne({ 
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}

return STATUS_DUPLICATE_EMAIL;
}
}

或者

可以使用async/await模式。当将一个函数声明为async时,你可以在它的承诺前面加上await,这将阻止代码的执行,直到它被解决。

app.post("/api/signup", async (req, res) => {
const status = await checkEmail(req, res);
}
...
checkEmail = (req, res) => {
return Database.findOne({ 
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}

return STATUS_DUPLICATE_EMAIL;
}
}

您应该返回Database.findOne()

同样使用async await来得到checkMail()的结果。

app.post("/api/signup", async (req, res) => {
const status = await checkEmail(req, res);
// some sign up logic...
}
...
app.post("/api/signup", (req, res) => {
const status = checkEmail(req, res);
// some sign up logic...
}
...
checkEmail = (req, res) => {
return Database.findOne({ 
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}

return STATUS_DUPLICATE_EMAIL;
}
}

最新更新