【问题标题】:Get firebase.auth().currentUser with async/await使用 async/await 获取 firebase.auth().currentUser
【发布时间】:2017-10-04 22:30:05
【问题描述】:

我使用 onAuthStateChange 观察者成功检查了用户的身份验证状态,并将用户重定向到仪表板页面(react-native 项目)。但是,在仪表板上,我已经想显示一些用户特定的数据,例如注册程序/统计。为此,我需要初始化和填充 currentUser 对象,这需要一些时间(我需要从那里获取 uid 以从数据库中获取一些数据)。因此,我正在寻找某种方法来等待此过程成功完成。我正在尝试在 componentDidMount 中使用 async/await 语法,但返回的结果为空。 (相同的语法在其他屏幕中成功运行,但在第一个屏幕中失败)

async componentDidMount() {
  try {
    let uid = await firebase.auth().currentUser.uid;
    console.log(uid);
  } catch(error) {
    console.log(error);
  }
}

等待使用 async/await 语法加载 currentUser 对象的最佳方法是什么?我认为原因可能是 firebase 返回 null 作为第一个结果,然后将正确的 uid 作为第二个。

目前,对于解决方法,我正在使用简单的 setInterval 函数,但我不想过多地增加加载时间。

  let waitForCurrentUser = setInterval(() => {
    if ( firebase.auth().currentUser.uid !== null ) {
        clearInterval(waitForCurrentUser);
        let uid = firebase.auth().currentUser.uid;
        this.setState({uid});
        return firebase.auth().currentUser.uid;
    } else {
      console.log('Wait for it');
    }
  }, 700);

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database ecmascript-2017


    【解决方案1】:

    setInterval 的等价物是:

    //calling the asynchronous function
      waitForCurrentUser(function(uid){
       if(uid)
       console.log('the user id is',uid)
      })
    
       async waitForCurrentUser(userIdIs){
    
        try {
           let uid = await firebase.auth().currentUser.uid;
           if(uid)
           {
             clearInterval(waitForCurrentUser);        
             this.setState({uid});
             userIdIs(uid); 
           }
           else {
           console.log('Wait for it');
          }
    
        }
    
        catch(e){
         console.log(e)
        }
    
      //  return userIdIs(uid);//returns promise
      };
    

    干杯:)

    【讨论】:

    • 不幸的是,它并没有太大变化。它返回 currentUser.uid 为 null 或抛出错误,因为此对象尚未完成加载或第一个结果为 null,我需要第二个或类似的东西。所以,我不确定如何等待这个对象完成加载。
    • 我认为控件绕过了这些语句......所以它可能在 if 条件下工作......
    • 你在哪里定义 userIdIs(uid)?可能在我的情况下它不起作用,因为我已将其替换为 return uid
    • 请查看编辑,我认为这肯定对你有用。
    • 仍然抛出错误。我已将 this.waitForCurrentUser((uid) => { console.log('the user id is',uid) }) 放在 componentDidMount() 部分并将函数本身粘贴在下面,但它没有帮助
    【解决方案2】:
    export async function getAuthUserID(): Promise<string | undefined> {
      return await new Promise( (resolve, reject) => {
        firebase.auth().onIdTokenChanged(async (user) => {
          if (!user) {
            resolve(undefined);
          } else {
            resolve(user.uid);
          }
    })
      }).then((uid: string | undefined)=>uid).catch(function(e) {
        throw (e);
      });
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:
    async getUid() {
            let user = await firebaseApp.auth().currentUser;
            let email = await user.uid;
    }
    

    希望对你有用

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 2018-09-14
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多