2016-07-15 12 views
1

は、だから私はtestVariableという変数を定義しているsignInWithPopup。firebase.auth()内から変数を変更し、($ scope.signInの内部初期に設定することはできません)機能。次にfirebase.auth()。signInWithPopup(プロバイダ).then()の機能に変更しました。場合I にconsole.log()firebase.auth()。signInWithPopup(プロバイダ).then()機能外部それは初期を返します。私はそれを返すように変更、以下のコードで間違っていますか?どんな助けでも大歓迎です。は(プロバイダ)機能

var app = angular.module("myApp", []); 

app.controller("MainController", ["$scope", function ($scope){ 
    $scope.googleSignInStyle = {}; 
    $scope.googleSignInText = ""; 
    $scope.signIn = function(){ 
     var provider = new firebase.auth.GoogleAuthProvider(); 
     var testVariable = "initial"; 

     firebase.auth().signInWithPopup(provider).then(function(result) { 
      var token = result.credential.accessToken; 
      var user = result.user; 
      var providerData = user.providerData[0]; 

      firebase.database().ref('users/' + providerData.displayName).set({Email: providerData.email, PhotoURL: providerData.photoURL, uid: providerData.uid}); 

      testVariable = "changed"; 

     }).catch(function(error) { 
      var errorCode = error.code; 
      var errorMessage = error.message; 
      var email = error.email; 
      var credential = error.credential; 
      console.log ("Error! Error code: " + errorCode + ", Email: " + email + ", Credential: " + credential + ". That's all we know."); 
     }); 

     console.log (testVariable); 
    } 
}]); 

答えて

1

.then()の呼び出しは非同期で実行されます。つまり、後でfirebase.auth().signInWithPopup(provider)が返されたときに実行されることを意味します。

したがって、あなたは効果的にtestVariableの値を変更していますが、それを印刷した後です。つまり、console.log(testVariable)を呼び出した後に何が起こるのでしょうか?

read thisという約束の概念に精通していない場合は、

+0

.then()関数が完了するまで、残りのコードを遅延させることは可能ですか?私がしようとしているのは、ユーザーがサインインすると、私は自分の名前を言うためにGoogleのボタンを使ってサインインを変更したいのです。これを行うには、変数 '$ scope.googleSignInText'をユーザ名に変更するだけです。問題は何らかの理由で.then()関数内から変数を変更できないということです。 – WebGavDev

+0

約束事の動作は、約束事が完了した後、非同期で実行し、then部分を実行することです。だから、コードの残りの部分は、それが完了するのを待つことができません –

1

問題は、signInWithPopupコールバックの外部にログオンしようとしていることです。 testVariableは、signInWithPopupがアシンクロナスであるため、値はありません。console.logに電話するまでには処理が完了しません。

$scope.signIn = function(){ 
    var provider = new firebase.auth.GoogleAuthProvider(); 
    var testVariable = "initial"; 

    firebase.auth().signInWithPopup(provider).then(function(result) { 
     var token = result.credential.accessToken; 
     var user = result.user; 
     var providerData = user.providerData[0]; 

     firebase.database().ref('users/' + providerData.displayName).set({Email: providerData.email, PhotoURL: providerData.photoURL, uid: providerData.uid}); 

     testVariable = "changed"; 
     console.log (testVariable); 
    }).catch(function(error) { 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     var email = error.email; 
     var credential = error.credential; 
     console.log ("Error! Error code: " + errorCode + ", Email: " + email + ", Credential: " + credential + ". That's all we know."); 
     console.log (testVariable); 
    }); 
} 

これを解決するには、達成しようとしている動作によって異なります。上記のコードは1つの可能な解決策ですが、私はちょうどconsole.logコールをコールバックの中に挿入しています。