Angular 执行回调时如何处理订单?

Angular 执行回调时如何处理订单?,angular,typescript,asynchronous,callback,firebase-authentication,Angular,Typescript,Asynchronous,Callback,Firebase Authentication,我在angular2应用程序中使用firebase进行身份验证,我遇到了回调问题。这是我的代码段,用于标识用户是否已登录 verifyLogin(url: string): boolean { var myUser = null; firebase.auth().onAuthStateChanged(function(user) { if (user) { myUser = user; console.log("sdfsdfsd"); console.log(myUs

我在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()
返回一个。这样,
verifyLogin()
只会在
onAuthStateChanged()完成后返回
true
false

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()
只会在
onAuthStateChanged()完成后返回
true
false

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”方法是异步的。使用@samAlvin-answer,使其返回承诺。记住,回调是异步的。如果要使用回调的结果,那么“verifyLogin”方法是异步的。使用@samAlvin-answer,使其返回一个承诺。此外,在创建新承诺时,最好进行try/catch包装,以确保不会陷入僵局。如果auth()抛出错误,这将永远无法解决()此外,在创建新承诺时,最好进行try/catch包装,以确保不会陷入死锁。如果auth()抛出错误,则永远无法解决()