使用async / await获取firebase.auth()。currentUser

时间:2017-05-06 15:00:12

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

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

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);

2 个答案:

答案 0 :(得分:2)

async getUid() {
        let user = await firebaseApp.auth().currentUser;
        let email = await user.uid;
}

希望它对你有用

答案 1 :(得分:0)

setInterval的等价性是:     //调用异步函数       waitForCurrentUser(函数(UID){        如果(UID)        console.log('用户ID是',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
  };

干杯:)