我有一个函数,应该返回用户的电子邮件从使用Firebase管理API getUser(uid)函数,
function getEmail(uid){
var email;
admin.auth().getUser(uid)
.then((userRecord) => {
return userRecord.email;
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
}
但是在另一个函数中当我创建一个变量来调用这个函数时,
email = getEmail(uid);
email中的值是未定义的,因为getUser函数返回了一个promise。如何使getEmail函数在返回之前等待获得userRecord的值?
我试过在函数的不同部分添加await语句,但我不确定如何正确地做到这一点。我是使用Google API的初学者。
返回getEmail
函数中从admin.auth().getUser(uid)
获得的Promise
function getEmail(uid) {
return admin.auth().getUser(uid)
.then((userRecord) => {
return userRecord.email;
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
}
然后使用返回的Promise链接then
回调。
getEmail(uid).then(email => {
console.log(email);
});
或者在async
函数中等待。
async function main() {
const email = await getEmail(uid);
console.log(email);
}
main();
编辑
正如你在下面的评论中所解释的:
基本上,我只是想让代码运行起来就好像它都是同步的/逐行的。
让异步代码同步是不可能的,但是用async / await
语法让它逐行运行是可能的。在异步函数中等待的承诺将逐行运行,因为你告诉代码在进入下一行之前等待它的解析。
我已经修改了来自CodePen的代码以包含上述语法。我们仍然使用相同的getEmail
函数,从admin.auth().getUser(uid)
返回承诺,只是等待它完成,然后再处理结果。
function getEmail(uid) {
return admin.auth().getUser(uid)
.then((userRecord) => {
return userRecord.email;
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
}
app.post("/sendx", async (req, res) => {
const uid = req.body.x.user.uid;
const email = await getEmail(uid);
let verified = false;
/*console.log(email.substring(email.indexOf('@')));
if (email.substring(email.indexOf('@')) == "@xxx.edu") {
verified = true;
}*/
res.send({ verified });
});
我希望这能澄清问题。