reactjs - 如何在 firebase.auth().currentUser 上异步/等待?

标签 reactjs async-await firebase-authentication

我正在使用 ReactJs,并定义了 Route这将加载 <Loans />如果路径是mywebsite.com/loans,则组件。以下是 <Loans /> 的代码片段成分。在 componentDidMount ,我有async/await获取currentUser来自firebase 。如果usernull ,页面将重定向至/signin页。

class Loans extends Component {
  componentDidMount = async () => {
    const user = await firebase.auth().currentUser;
    if (!user) {
      this.props.history.push("/signin");
    }
  };
  render () {
  ...}
}

这是 <SignIn /> 的代码片段成分。在 SignIn组件,有一个监听器来监听任何身份验证状态更改,如果用户登录,页面将重定向到 /loans页。

class SignIn extends React.Component {
  componentDidMount() {
    firebase.auth().onAuthStateChanged(user => {
      if (user) {
        this.props.history.push("/loans");
      }
    });
  }

  render () {
    ...
  }
}

我实际上已经登录了。但是我观察到一个奇怪的行为,每当我刷新页面 /loans ,页面将重定向至/signin页面不到一秒钟,然后快速重定向回 /loans页。

我的问题是我是否已经有 firebase.auth().currentUser成为async/await ,我怎么还能得到null对于user<Loans />组件,我只看到 <Loans />当页面从 <SignIn /> 重定向时的组件页?如果我的情况下已经有用户登录,我怎样才能避免看到登录页面。谢谢!

最佳答案

firebase.auth().currentUser 不是一个 promise ,它是一个 User 对象,因此对其使用 await 没有多大意义。根据API documentation ,它只会是一个 User 对象,或者为 null。当没有用户登录时,或者 User 对象尚不可用时,它将为 null。

您应该做的是在 SignIn 中使用相同风格的监听器来确定 User 对象何时准备就绪,并仅在该监听器指示用户存在后呈现任何内容。

关于reactjs - 如何在 firebase.auth().currentUser 上异步/等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472380/

相关文章:

c# - 加速大量 IP 的反向 DNS 查找

javascript - 如何在 Visual Studio 代码中调试异步/等待?

android - 使用 Firebase 进行基于角色的身份验证

javascript - React Google map 自定义标记旋转

javascript - 有什么方法可以在 native react 中选择突出显示pdf文件中的文本

javascript - 使用箭头函数 react this.setState 导致控制台出错

reactjs - 如何在 Jest 中使用 async/await 对 Promise catch() 方法行为进行单元测试?

android - 无法在 Firebase 上创建新用户

android - 火力地堡不工作。安卓

javascript - 如何在js中从字符串构建变量?