【问题标题】:Why is javascript async function not awaiting for firebase.auth method to finish?为什么javascript异步函数不等待firebase.auth方法完成?
【发布时间】:2020-06-12 05:21:29
【问题描述】:

我正在尝试检查用户是否已登录并基于此返回 true 或 false。但函数在 firebase 调用完成之前返回。

async function checkLogin() {
    var result;

    await firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
          result = true;
          console.log("user is signed in");
        } else {
        result = false;
          console.log("user is not signed in");
        }
        });
        console.log("End of function");
        return result;
}

“函数结束”在上述任何一个之前打印出来。结果中的值始终未定义。该函数似乎在firebase.auth() 完成之前返回。有没有办法让它在返回之前等待。

【问题讨论】:

  • 如果您的最终目标是检查用户的登录状态,您可以使用firebase.auth().currentUser
  • onAuthStateChanged 是否真的返回了一个承诺?返回一个承诺接受一个回调似乎很奇怪。
  • @frunkad 也不起作用。它从不等待等待。返回未定义
  • 在这种情况下,您的 checkLogin() 函数(更好:它的功能)应该从 onAuthStateChanged 中调用
  • @jonrsharpe 我不这么认为

标签: javascript firebase async-await firebase-authentication


【解决方案1】:

onAuthStateChanged() 不返回一个承诺,它返回一个取消订阅函数。您使用onAuthStateChanged() 添加一个侦听器/观察者/订阅者,随着登录状态随时间的变化而被调用。您可以在该回调中编写代码,以在用户登录或退出时执行您想要的操作。 Promise 在这里对你没有帮助 - 设计你的代码来使用那个回调。

【讨论】:

    【解决方案2】:

    正如 Doug 所提到的,onAuthStateChanged() 不会返回一个承诺而是一个事件,您可以将您的逻辑更改为:

    async function afterLoginTask() {
        var result;
        // perform UI or other changes
        return result;
    }
    
    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
          console.log("user is signed in");
          afterLoginTask()
        } else {
          console.log("user is not signed in");
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2019-06-16
      • 1970-01-01
      • 2019-10-19
      • 2014-08-09
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多