2016-07-12 3 views
2

Ich versuche, Google-Authentifizierungsbibliothek mit Versprechen zu laden, aber ich scheitere, wenn ich versuche, gapi.auth2.getAuthInstance() aufzurufen und es in Versprechen zurückzugeben;GoogleAuth-Bibliothek wird mit Versprechen geladen

Hier ist, wie ich das tue:

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

Alles funktioniert, bis ich wieder auth2.init (params) dann Browser einfriert. Was ist hier los?

Antwort

1

Ich habe gerade das gleiche Problem erlebt.

Es scheint, als ob Sie die init() Versprechen des auth2 Objekts nicht verketten können.

Ich musste es umwickeln, um das Einfrieren des Browsers zu vermeiden.

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

es war auch interessant, dass es nicht direkt die resolve Funktion anwenden könnte.

.then(resolve); 

aktualisieren

Wie oben gesagt, das zurückgegebene Objekt des init() Anrufs kein Versprechen ist, ist es eine Art Wrapper und liefert nur ein echten Versprechen, sobald Sie die .then Methode aufgerufen

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.