onAuthStateChanged被调用两次,而它所驻留的函数只被调用一次

时间:2017-09-12 13:29:05

标签: firebase firebase-authentication

function signInWithGoogle(){
//console.log("clicked signInWithGoogle");
firebase.auth().onAuthStateChanged(function(user){
    if(user){
        alert("Already logged in");
    }
    else{
        // var info=document.getElementById("info");
        var provider=new firebase.auth.GoogleAuthProvider();
        firebase.auth().signInWithPopup(provider).then(function(result){
            if(result.credential){
                var token=result.credential.accessToken;

                console.log("token="+token);
            }
            var user=result.user;
            console.log("user_provider="+user.displayName+" user_email="+user.email+" user_dp="+user.photoURL+" user_verification="+user.emailVerified+" uid="+user.uid);
        }).catch(function(error){
            var errorCode=error.code;
            var errorMessage=error.message;
            var email=error.email;
            var credential=error.credential;
            alert(errorMessage);
        });
    }
});
}

当用户第一次登录时,登录过程进展顺利但在此之后会显示一条警告消息(“已经登录”),表示再次调用onAuthStateChanged。如何使其不被调用再次?

我确信signInWithGoogle()会被调用一次。

P.S。我已经看到很多与此相关的问题,但他们没有任何具体的解决方案。

1 个答案:

答案 0 :(得分:0)

当用户未登录时,第一次调用

onAuthStateChangedsignInWithPopup。这会导致用户登录,再次触发相同的观察者,从而触发警报消息。 我同意@ camden_kid的评估。但是如果你坚持在登录功能中添加这个观察者,你可以在第一次调用它时取消订阅:

var unsubscribe = firebase.auth().onAuthStateChanged(function(user){
  unsubscribe();
  ...
});

这可以保证每次调用此函数时都会调用它。