【问题标题】:How to handle the order when executing the callbacks?执行回调时如何处理订单?
【发布时间】:2018-03-21 09:49:01
【问题描述】:

我在我的 angular2 应用程序中使用 firebase 进行身份验证,但我遇到了回调问题。这是我的代码段,用于识别用户是否已登录。

verifyLogin(url: string): boolean {
var myUser = null;
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    myUser = user;
    console.log("sdfsdfsd");
    console.log(myUser);
  } else {
    // No user is signed in.
  }
});
console.log("check");
console.log(myUser);
if(myUser){
  return true;
}
console.log(myUser);
this.router.navigate(['/admin/signin']);
return false;

}

如果用户已登录,此 verifyLogin 函数将返回 true,否则返回 false。但问题是底部部分,其中包含在执行回调之前执行的 if 条件。我也无法在回调中返回。如何解决这个问题?

【问题讨论】:

  • 记住,回调是异步的。如果您要使用回调的结果,那么您的方法“verifyLogin”是异步的。使用@samAlvin 答案,使其返回一个 Promise。

标签: angular typescript asynchronous callback firebase-authentication


【解决方案1】:

解决此问题的一种方法是使verifyLogin() 返回Promise。这样,verifyLogin() 只会在 onAuthStateChanged() 完成后返回 truefalse

verifyLogin(url: string): Promise<boolean> {
    return new Promise((resolve) => {
        var myUser = null;
        firebase.auth().onAuthStateChanged(function(user) {
            if (user) {
                myUser = user;
                console.log("sdfsdfsd");
                console.log(myUser);
                resolve(true);
            } else {
                // No user is signed in.
                resolve(false);
            }
        });
    });
}

然后你可以像这样调用verifyLogin()

verifyLogin("someUrl").then(isLoggedIn => {
    if (isLoggedIn == false) {
        this.router.navigate(['/admin/signin']);
    }
});

【讨论】:

  • 另外,当创建一个新的 Promise 时,你最好有一个 try/catch 包装,以确保你不会陷入死锁。如果 auth() 抛出错误,这将永远无法解决(stackoverflow.com/questions/46025734/…
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2022-11-09
  • 2013-10-26
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多