0

我在我的angular2應用程序中使用firebase進行身份驗證,並遇到回調問題。這是我的代碼段,以確定用戶是否已登錄。如果用戶已登錄否則爲false如何在執行回調時處理訂單?

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。但問題是在執行回調之前包含if條件的底部。我也不能在回調中返回。如何解決這個問題?

+1

記住,回調是異步。如果你打算使用回調的結果,那麼你的方法「verifyLogin」是異步的。使用@samAlvin答案,使其返回一個Promise。 – Lostfields

回答

3

解決此問題的一種方法是使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']); 
    } 
}); 
+1

另外,當創建一個新的Promise時,最好有一個try/catch包裝來確保你不會陷入僵局。如果auth()拋出一個錯誤,這永遠不會解決(https://stackoverflow.com/questions/46025734/then-of-promise-all-result-never-executes/46067409#46067409) – Lostfields

+0

謝謝!它現在工作正常:) – user3257970