2016-07-12 11 views
2

私は約束を使ってGoogle認証ライブラリを読み込もうとしていますが、gapi.auth2.getAuthInstance()を呼び出して約束したときに失敗します。ここでGoogleAuthライブラリで約束を読み込んで

は、私がこれをやっている方法は次のとおりです。私は、ブラウザがフリーズauth2.init(のparams)に戻るまで

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 
    }); 

すべてが動作します。 ここには何が起こっていますか?

答えて

1

私はちょうど同じ問題を経験しました。

auth2オブジェクトの約束をinit()にすることはできないようです。

ブラウザがフリーズするのを避けるために、周りを折り返す必要がありました。

return new Promise<void>(resolve => { 
    gapi.auth2.init({ 
    client_id: this._clientId, 
    scope: 'profile' 
    }).then(() => resolve()); 
}) 

はまた、私が直接resolve関数を適用することができなかったこと面白かったです。

.then(resolve); 

更新としては、上記と

init()コールの返されるオブジェクトは約束ではない、それはラッパーの一種であり、あなたが.thenメソッドを呼び出した後にのみ本当約束を返します。

enter image description here

return gapi.auth2.init({ 
    client_id: this._clientId, 
    scope: 'profile' 
}).then(); 
// Auth2 only returns a promise, when we chained into the PromiseLike object once. 
関連する問題