私は、角度のサービスにウェブアプリにGoogleログインを入れようとしていますが、私が間違っていることを理解できません。予想通り、私はページ、コンソールログservice started
をロードし、その後私は、エラーTypeError: Cannot read property 'getAuthInstance' of undefined
を取得するとここで角度サービスがexpとして動作していない
は私のサービス
angular.module('sensdogserver.services', [])
.service('AuthenticationService', function ($window,$http) {
console.log("service started")
gapi.load('auth2', function() {//load in the auth2 api's, without it gapi.auth2 will be undefined
gapi.auth2.init(
{
client_id: 'CLIENT_ID',
}
);
});
this.googlelogin = function(){
var GoogleAuth = gapi.auth2.getAuthInstance();
GoogleAuth.signIn().then(function(googleUser){//request to sign in
var profile = googleUser.getBasicProfile();
username = profile.getName();
$window.localStorage['username'] = username;
googleUser = googleUser;
googletoken = googleUser.getAuthResponse().id_token;
console.log("google token: " + googletoken);
$http.get("/api/auth/google/token",{headers:{'id_token':googletoken}}).success(function(data){console.log(data)}).error(function(data){console.log(data)});
}
)};
this.googlesignout =function() {
var auth2 = gapi.auth2.getAuthInstance();
console.log("signing out: ", username);
auth2.signOut().then(function() {
googleUser = null;
googletoken = null;
username = null;
console.log('User signed out.');
});
}
var googleUser = null;
var googletoken = null;
var username = null;
this.googlelogin();
});
です。 Googleログインへの呼び出しをコメントにしてコントローラからgooglelogin
に電話すると、ページがロードされた後、それは絶対にうまく動作します。私が理解できないことは、ログメッセージを受け取ることです。サービスがロードされ、何かが実行されているように見えますが、すべてではありません。
それは "魔法のように"動作しますが、これは私が非常によく理解していない非同期の謎の一部です(私はまだ望みます...)。ここで何が起こるかは、物が順番に実行されるということですが、コールバックを持っているので 'gapi.load'を待つことはありません。したがって、それを渡して、それに依存するすべてがコールバックに入るはずです。右? – fbence
'gapi.load(...)'を呼び出すと、目的のAPIを呼び出しますが、レスポンスを待つことはありません(非同期で非ブロッキングです)。応答は別のイベントループでトリガされるコールバック関数で利用可能になります。これについてはhttps://developer.mozilla.org/cs/docs/Web/JavaScript/EventLoopをご覧ください。これについてはいくつかの基本があります。 'gapi.load'を呼び出すことは' setTimeout'の例と非常によく似ています。 –