promiseを使用してgoogle認証ライブラリをロードしようとしていますが、gapi.auth2.getAuthInstance()を呼び出してpromiseで返そうとすると失敗します。
これが私がこれをしている方法です:
var loadPlatform = function ($q) {
var deferred = $q.defer(),
platform = document.createElement('script');
platform.src ='https://apis.google.com/js/platform.js';
platform.type = 'text/javascript';
platform.async = true;
platform.defer = true;
platform.onload = deferred.resolve;
platform.onerror = deferred.reject;
document.body.appendChild(platform);
return deferred.promise;
};
//I return this from other function
return loadPlatform($q)
.then(function () {
var deferred = $q.defer();
gapi.load('auth2', function () {
deferred.resolve(gapi.auth2);
});
return deferred.promise;
})
.then(function (auth2) {
//This function retuns Promise
//https://developers.google.com/identity/sign-in/web/reference#gapiauth2initparams
return auth2.init(params);
})
.then(function (GoogleAuth) {
//Here I should have solved GoogleAuth object
});
auth2.init(params)を返すまではすべて機能し、その後ブラウザがフリーズします。ここで何が起こっているのですか?
私はちょうど同じ問題を経験しました。
オブジェクトのinit()
約束を連鎖させることはできないようですauth2
。
ブラウザがフリーズしないように、ラップアラウンドする必要がありました。
return new Promise<void>(resolve => {
gapi.auth2.init({
client_id: this._clientId,
scope: 'profile'
}).then(() => resolve());
})
また、resolve
関数を直接適用できないのも面白かったです。
.then(resolve);
更新
上で述べたように、init()
呼び出されたオブジェクトはpromiseではなく、一種のラッパーであり、メソッドを呼び出したときにのみ実際のpromiseを返します。.then
return gapi.auth2.init({
client_id: this._clientId,
scope: 'profile'
}).then();
// Auth2 only returns a promise, when we chained into the PromiseLike object once.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加