GoogleAuth 库加载承诺

GoogleAuth library loading with promises

我正在尝试使用 promises 加载 google 身份验证库,但是当我尝试调用 gapi.auth2.getAuthInstance() 和 return 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
    });

一切正常,直到我 return auth2.init(params) 然后浏览器冻结。 这里发生了什么?

我刚刚遇到了同样的问题。

您似乎无法链接 auth2 对象的 init() promise。

我不得不环绕它以避免浏览器冻结。

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

同样有趣的是我无法直接应用 resolve 函数。

.then(resolve);

更新

如上所述,init() 调用的返回对象不是承诺,它是一种包装器,只是 returns 一个 真实的 承诺一旦你调用 .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.