异步功能不等待

时间:2019-08-19 10:51:52

标签: javascript async-await

我遇到一个问题,其中异步功能似乎没有在等待。我正在从另一个调用一个异步函数,第二个在异步操作完成后返回一个值,然后第一个应在等待时返回该值。但是,在第一个函数中记录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);
  }
}

1 个答案:

答案 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()而不是awaittry/catch
    • 以及一些拒绝解决您无法解决的问题(可能是在catch块中)

但是我建议您使用async/await方法,因为它更易于阅读。