0

私はangle2アプリで認証に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条件がコールバックを実行する前に実行されるbottom部分です。コールバックの中に戻すことはできません。これを修正するには?

+1

は、コールバックが非同期であることを覚えておいてください。コールバックの結果を使用する場合、メソッド "verifyLogin"は非同期です。 @samAlvinの答えを使用して、Promiseを返します。 – Lostfields

答えて

3

これを解決する方法の1つは、verifyLogin()Promiseを返すようにすることです。このように、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("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

関連する問題