我遇到一个问题,其中异步功能似乎没有在等待。我正在从另一个调用一个异步函数,第二个在异步操作完成后返回一个值,然后第一个应在等待时返回该值。但是,在第一个函数中记录accessToken
时,它会在等待第二个函数返回之前进行记录。我要去哪里错了?预先感谢。
export const confirmCode = async (verificationId, code) => {
try {
const credential = await firebase.auth.PhoneAuthProvider.credential(verificationId, code);
const accessToken = await authenticate(credential);
console.log(accessToken); // prints undefined as does not wait for above function call?
return accessToken;
} catch (error) {
console.log(error)
// this.showMessageErrorByCode(e.error.code);
}
}
const authenticate = async (credential) => {
try {
await firebase.auth().signInWithCredential(credential).then(result => {
const user = result.user;
user.getIdToken().then(accessToken => {
return accessToken;
});
})
} catch (error) {
console.log(error);
}
}
答案 0 :(得分:4)
您不应将async/await
与旧版本.then()
混合使用。
仅在没有then()
的情况下使用它,就像这样:
export const confirmCode = async (verificationId, code) => {
try {
const credential = await firebase.auth.PhoneAuthProvider.credential(verificationId, code);
const accessToken = await authenticate(credential);
console.log(accessToken); // prints undefined as does not wait for above function call?
return accessToken;
} catch (error) {
console.log(error)
// this.showMessageErrorByCode(e.error.code);
}
}
const authenticate = async (credential) => {
try {
let result = await firebase.auth().signInWithCredential(credential); // <-- use await
const user = result.user;
accessToken = await user.getIdToken(); // <-- use await
return accessToken;
} catch (error) {
console.log(error);
}
}
有关更详细的解释,为什么您的代码不起作用:
.then()
之内返回的,return new Promise((resolve, reject) => { /* Code ... */ });
来包装函数内容resolve(accessToken)
而不是返回.then()
和.catch()
而不是await
和try/catch
但是我建议您使用async/await
方法,因为它更易于阅读。